我正在尝试进行一些概念测试,以更改罗技MS3200键盘的一项功能(缩放功能)。我有从变焦控制发送的键。所以,我有一个主应用程序,以及一个包含钩子程序的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()。
答案 0 :(得分:2)
这可能是可能的,但是不值得你花时间去调查。
而是将钩子设置代码移动到DLL。
哦,我认为你需要将DLL模块句柄传递给钩子设置函数,而不是NULL
答案 1 :(得分:1)
处理此问题的一种可能方法是在DLL中使用另一个导出函数将hHook传递给,并将其保存在DLL中的本地变量中,以便在HookProc中使用。
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;
}
答案 2 :(得分:0)
DLL中的代码无法直接访问调用应用程序中的变量,因为无法保证加载DLL的应用程序会定义这些变量,即使这样做,DLL也无法知道它在哪里将被存储。
你可以在DLL中有一个全局变量和一个额外的入口点来设置它,你在调用SetWindowsHookEx之后调用它。在调用CallNextHookEx之前,DLL需要等到这个入口点被调用。
答案 3 :(得分:0)
在NT / XP / 2003等上,CallNextHookEx的第一个参数被忽略。请参阅CallNextHookEx的文档:
http://msdn.microsoft.com/en-us/library/ms644974%28VS.85%29.aspx
HTH