键盘钩子的回调函数为什么不执行?

wanggtz 2008-03-01 04:23:52
我想在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")未执行;

...全文
348 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
fantcy 2009-05-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cnzdgs 的回复:]
注意SetWindowsHookEx的最后参数,你现在给的参数是Hook本线程,如果要Hook所有线程此参数需要给0。
[/Quote]
同意上面
cnzdgs 2008-03-01
  • 打赏
  • 举报
回复
注意SetWindowsHookEx的最后参数,你现在给的参数是Hook本线程,如果要Hook所有线程此参数需要给0。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧