VC++一个关于全局钩子的简单问题问题

来源:百度知道 编辑:UC知道 时间:2024/09/20 17:38:07
LRESULT CALLBACK keyboard(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
)
{
n_GameHwnd=::FindWindow(NULL,"Warcraft III");
N++;
if(VK_F4==wParam&&N%2==1)
{
if(n_GameHwnd==NULL)
{
MessageBox(n_Hwnd,"程序未启动","提示",MB_OK);
}
else
{
SetTimer(n_Hwnd,1,100,TimerProc);
}
}
if(VK_F4==wParam&&N%2==0)
{
KillTimer(n_Hwnd,1);
}
return 0;
}这个是我想模拟键盘ALT键按下,魔兽争霸显血用的(看replay的时候不用老按着ALT键呵呵)以上是部分代码,F4按下的时候settimer我在TimerProc函数中PostMessage(n_GameHwnd,WM_SYSKEYDOWN,VK_MENU,0);血是可以显出来,可是我想在第二次按F4的时候取消显血,没成功,游戏一开始一按F4就一直显血。经测试KillTimer(n_Hwnd,1);这句代码确实执行了,为什么还是一直显血啊?

在 KillTimer 后面加上 PostMessage(n_GameHwnd,WM_SYSKEYUP,VK_MENU,0);

N++逻辑有问题,楼主针对N变量再仔细分析一下。答案就不说了,很好找。

另外,对于n_GameHwnd的处理可以精炼些,譬如不要一按键,就FindWindow,只有判断是按下了F4键后,如果n_GameHwnd==NULL,再FindWindow。KillTimer后,n_GameHwnd再初始化到NULL。