使用HOOK改变鼠标消息
最近因为要让一个特定的软件 改变鼠标发送的消息 比如说WM_RBUTTONDOWN => WM_LBUTTONUP
打算用DLL注入的方式
注入DLL到目标程序后 一直无法截获鼠标消息
不知道是否得枚举出所有线程才行啊(win32苦手每次看到那一串API的参数就头疼,咋简单咋整啊)
Findewindow都是返回NULL,在EXE中正常。改用getcurrentthreadid 也无法截获 伪代码贴下 大家帮帮看怎么回事
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
hDll = (HINSTANCE)hModule;
DWORD dw = GetCurrentThreadId();
g_hHook = SetWindowsHookEx(WH_MOUSE,MyKeyboardHook, hDll, dw);
}
LRESULT CALLBACK MyKeyboardHook( int nCode,WPARAM wParam,LPARAM lParam )
{
::MessageBoxA(NULL,"catch",NULL,NULL);
return true;
}
[解决办法]
不用MFC,那个把本来简单的事情弄复杂
这个是用鼠标钩子切换左右键的
- C/C++ code
LRESULT CALLBACK MouseHookProc( __in int code, __in WPARAM wParam, __in MSLLHOOKSTRUCT*lParam){ static INPUT Input={INPUT_MOUSE}; if(code<0||lParam->flags&LLMHF_INJECTED)return CallNextHookEx(0,code,wParam,(LPARAM)lParam); switch(wParam) { case WM_LBUTTONDOWN: Input.mi.dx=lParam->pt.x; Input.mi.dy=lParam->pt.y; Input.mi.mouseData=lParam->mouseData; Input.mi.dwFlags=MOUSEEVENTF_RIGHTDOWN; Input.mi.time=lParam->time; Input.mi.dwExtraInfo=lParam->dwExtraInfo; SendInput(1,&Input,sizeof(INPUT)); return 1; case WM_LBUTTONUP: Input.mi.dx=lParam->pt.x; Input.mi.dy=lParam->pt.y; Input.mi.mouseData=lParam->mouseData; Input.mi.dwFlags=MOUSEEVENTF_RIGHTUP; Input.mi.time=lParam->time; Input.mi.dwExtraInfo=lParam->dwExtraInfo; SendInput(1,&Input,sizeof(INPUT)); return 1; case WM_RBUTTONDOWN: Input.mi.dx=lParam->pt.x; Input.mi.dy=lParam->pt.y; Input.mi.mouseData=lParam->mouseData; Input.mi.dwFlags=MOUSEEVENTF_LEFTDOWN; Input.mi.time=lParam->time; Input.mi.dwExtraInfo=lParam->dwExtraInfo; SendInput(1,&Input,sizeof(INPUT)); return 1; case WM_RBUTTONUP: Input.mi.dx=lParam->pt.x; Input.mi.dy=lParam->pt.y; Input.mi.mouseData=lParam->mouseData; Input.mi.dwFlags=MOUSEEVENTF_LEFTUP; Input.mi.time=lParam->time; Input.mi.dwExtraInfo=lParam->dwExtraInfo; SendInput(1,&Input,sizeof(INPUT)); return 1; } return CallNextHookEx(0,code,wParam,(LPARAM)lParam);}int main(){ HHOOK hHook;MSG msg; hHook=SetWindowsHookExW(WH_MOUSE_LL,(HOOKPROC)MouseHookProc,GetModuleHandleW(0),0); while(GetMessageW(&msg,0,0,0)!=-1);}