2009-01-30 101 views
0

我正在嘗試一些概念測試,以更改Logitech MS3200鍵盤的功能之一(縮放功能)。我有從縮放控制發送的鍵。所以,我有一個主應用程序和一個包含鉤子程序的dll。如何從dll訪問調用應用程序中的變量?

這裏的主要應用:

#include <stdio.h> 
#include <windows.h> 

HANDLE hHook; 

int main() 
{ 
    HINSTANCE hMod = GetModuleHandle(NULL); 

    hHook = SetWindowsHookEx(WH_KEYBOARD, HookProc,0,0); 

    if(hHook == NULL) 
     printf("Unable to set hook! Error: %d", GetLastError()); 
    else 
     printf("Hook set successfully!"); 

    while(TRUE) 
    { 
     Sleep(1000); 
    } 

    return 0; 
} 

這裏是鉤子程序DLL:

#include <windows.h> 

int __declspec (dllexport) HookProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if(nCode < 0) 
    { 
     return CallNextHookEx(hHook, nCode, wParam, lParam); 
    } 


    if(wParam == VK_ADD || wParam == VK_SUBTRACT) 
    { 
     short status = GetKeyState(VK_CONTROL); 

     if(status == 1) 
     { 
      if(wParam == VK_ADD) 
       wParam = VK_UP; 
      else 
       wParam = VK_DOWN; 
     } 
    } 

    return CallNextHookEx(hHook, nCode, wParam, lParam); 
} 

int WINAPI dllmain(HINSTANCE hMod, DWORD data, LPVOID lpVOid) 
{ 
    return 0; 
} 

我需要能夠從DLL訪問什麼由調用SetWindowsHookEx(HHOOK)返回,在爲了調用CallNextHookEx()。

回答

2

這可能是可能的,但它是不值得你花時間去調查。

而是將掛鉤設置代碼移動到DLL。

哦,我想你需要的DLL模塊句柄傳遞給鉤子設置功能,而不是一個NULL

+0

是有道理的。謝謝 – scottm 2009-01-30 22:02:55

0

DLL中的代碼無法直接訪問調用應用程序中的變量,因爲不能保證加載該DLL的應用程序將定義這些變量,並且即使這樣做,DLL也無法知道在哪裏它將被存儲。

你可以在DLL中有一個全局變量,並有一個額外的入口點來設置它,你在調用SetWindowsHookEx之後調用它。在調用CallNextHookEx之前,DLL需要等待直到調用入口點。

1

處理此問題的一種可能方法是在您的DLL中將另一個導出函數傳遞給hook,並將其保存在HookProc中用於DLL的局部變量中。


HANDLE dllHook; 
void __declspec (dllexport) HookHandle(HANDLE hHook) 
{ 
    dllHook = hHook; 
} 

int __declspec (dllexport) HookProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if(nCode < 0 && dllHook!= NULL) 
    { 
     return CallNextHookEx(dllHook, nCode, wParam, lParam); 
    } 
    //.... 
} 

int WINAPI dllmain(HINSTANCE hMod, DWORD data, LPVOID lpVOid) 
{ 
    dllHook = NULL; //initialize 
    return 0; 
} 
相關問題