键盘钩子的回调函数为什么不执行?
我想在DLL注入到其他进程时,创建一个非模态对话框。使用了下面的思路:
1 在DLL入口,执行StartHook()
2 在StartHook()中,建立一个线程,在线程函数中,设置键盘钩子
3 在键盘钩子的回调函数中,判断如果按下特定键,则创建非模态对话框
问题:键盘钩子可以成功创建,但键盘钩子回调函数不执行,请专家赐教。
/////DLL入口函数
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
gInstance = hInstance;
if (!AfxInitExtensionModule(AssistDLL, hInstance))
return 0;
StartHook();
}
}
///StartHook()函数
bool StartHook()
{
DWORD theThreadId;
HANDLE Trd = ::CreateThread(NULL,0,MyThread,NULL,0,&theThreadId);
if (!Trd) ::OutputDebugString("Creating Thread failed at StartHook()....");
else ::OutputDebugString("Thread created....");
return TRUE;
}
///线程函数中创建一个键盘钩子和消息钩子
DWORD WINAPI MyThread(LPVOID lpParameter)//线程函数
{
g_hHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProcg,gInstance, ::GetCurrentThreadId());
m_hHook=SetWindowsHookEx(WH_CALLWNDPROC , (HOOKPROC)CallWndProc, gInstance, ::GetCurrentThreadId());
::sprintf(tmp, "MyThread-> g_hHook = %x, m_hHook=%x", g_hHook,m_hHook);
::OutputDebugString(tmp);
MSG msg;
while (GetMessage(&msg, 0, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
///键盘钩子回调函数
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
TRACE0("KeyboardProc step 1");
if(((DWORD)lParam&0x40000000) && (HC_ACTION==nCode))
{
DWORD vKey=0;
DWORD nScan=0;
int CtrState=0;
vKey=wParam;
nScan=lParam;
nScan>>=16;
nScan=nScan&0x000000ff;//ctr=29,sft=42,aLT=56,ent=28,clk=58,q=16,S=31,X=45
nScanValue[0] = nScanValue[1];
nScanValue[1] = nScan;
CtrState=HIBYTE(::GetKeyState(VK_CONTROL));
if (HIBYTE(::GetKeyState(VK_CONTROL))!=255) return CallNextHookEx( g_hHook, nCode, wParam, lParam );
if ((vKey==StartKey)&&(CtrState==255))
{
TRACE0("KeyboardProc step 2");
if (s_UP==true)
{
//::ShowWindow(g_hWG, SW_SHOW);//::SendMessage(g_hSM,WM_SHOWWINDOW,true,0);
TRACE0("KeyboardProc step 3");
ShowDiag();
CString t_Str;
t_Str.Format("MainWin=%d->",g_hWG);
t_Str=t_Str + "显示外挂";
OutputDebugString(t_Str);
::Beep(120,200) ;
::Sleep(50) ;
::Beep(120,200) ;
s_UP=false;
x_UP=true;
}
}
else if ((vKey==StopKey)&&(CtrState==255)) //((nScanValue[0] == 29) && (nScanValue[1]==45))//vKey == 88
{
TRACE0("KeyboardProc step 21");
if (x_UP==true)
{
//::ShowWindow(g_hWG, SW_HIDE);//WM_SHOWWINDOW,false,0);
TRACE0("KeyboardProc step 22");
HideDiag();
CString t_Str;
t_Str.Format("MainWin=%d->",g_hWG);
t_Str=t_Str +"Press Ctrl + X";
OutputDebugString(t_Str);
::Beep(240,500) ;
x_UP=false;
s_UP=true;
}
}
else if ((vKey==VK_END)&&(CtrState==255)) //((nScanValue[0] == 29) && (vKey == 81))
{
}
}
return CallNextHookEx( g_hHook, nCode, wParam, lParam );
}
////////////////
调试结果,钩子可以成功创建(g_hHook,m_hHook不为0),但不能执行键盘钩子回调函数,函数开头的TRACE0("KeyboardProc step 1")未执行;