|
具体现象是远程线程注入调用SetHook成功,目标程序已经弹出了消息框,显示键盘钩子安装成功,但是按指定键没任何反应。
如果直接用SetWindowsHookEx注入就正常
DLL内部分代码如下:
void WINAPI SetHook()
{
DWORD dwTid = GetMainThreadIdByPid(GetCurrentProcessId());
HHOOK hHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, theApp.m_hInstance, dwTid);
if (NULL == HHOOK )
{
::MessageBox(NULL, _T("键盘钩子安装失败。"), _T("Tips"), MB_ICONINFORMATION);
} else
::MessageBox(NULL, _T("键盘钩子安装成功。"), _T("Tips"), MB_ICONINFORMATION);
}
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if ( VK_HOME == wParam && (lParam>>31&1) == 1 )
{
MessageBoxA(NULL, "Home键", NULL, NULL);
return TRUE;
} else {
return CallNextHookEx( NULL, nCode, wParam, lParam );
}
return FALSE;
}
// 根据进程ID获取该进程主线程ID,失败返回0
DWORD GetMainThreadIdByPid(DWORD dwPid)
{
THREADENTRY32 te32;
te32.dwSize = sizeof(THREADENTRY32);
HANDLE hSnapshot =CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if(Thread32First(hSnapshot, &te32))
{
do{
if(dwPid == te32.th32OwnerProcessID)
{
return te32.th32ThreadID;
}
}while(Thread32Next(hSnapshot, &te32));
}
return NULL;
} |
上一篇: tcpip通讯如何设置 发送 接收 数据超时 ,让程序执行下去,下一篇: SDI重绘时如何布局
|