我用全局键盘钩子做了一个修改键盘按键,消息拦截一切都正常就是在发送消息的时候
SendMessage(GetActiveWindow(),WM_KEYUP,(WPARAM)"X",0);或者改成PostMessage都是一样的效果,没有响应
我换成keybd_event()就没有这个问题了,但是又出了另外一个问题就是
比如我把‘A’改成‘Z’,我按下Z的时候出现两个字符ZA,请问这是什么原因???有什么好的解决方法吗??谢谢各位大侠了
SendMessage(GetActiveWindow(),WM_KEYUP,(WPARAM)"X",0);或者改成PostMessage都是一样的效果,没有响应
我换成keybd_event()就没有这个问题了,但是又出了另外一个问题就是
比如我把‘A’改成‘Z’,我按下Z的时候出现两个字符ZA,请问这是什么原因???有什么好的解决方法吗??谢谢各位大侠了
keybd_event()相当于重新发送一遍键盘消息,这个消息可能不经过你的HOOK,所以导致你出现两个字符的情况,最好还是用sendmessage,至于为什么没有效果,因为你的窗口句柄不对,应该用FindWindow来获得窗口句柄
(飞机党飞行员)
我用SPY++找到的窗口时正确的,但是SendMessage还是不管用
还有一个问题就是为什么SendMessage之后返回和调用CallNextHook结果不一样
一个有本来的输入一个没有?
使用keybd_event自动给焦点窗口
你需要在钩子过程返回非0值以阻止原来的按键消息到达目标窗口
改键就应该使用SendInput或封装它的keybd_event
我使用了好几种方法。
比如说安装钩子之前,先给一个全局变量HWND hwnd赋值调用窗口的句柄,但是只有自身窗口有消息时才会发送过来。
我以为是hwnd这个变量当用到其他窗口的时候发生了变化,因此用了FindWindow来获取我的程序的窗口,但是,还是不行。根本就没有消息会传送过来。
程序如下。static HWND hwnd;
HHOOK Hook;DllExport void WINAPI InstallLaunchEv(HWND m_hwnd)
{//系统钩子的安装
Hook = (HHOOK)SetWindowsHookEx(WH_CBT,(HOOKPROC)LauncherHook,theApp.m_hInstance,0);
hwnd = m_hwnd;
}
LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam)
{//这是处理键盘事件的地方,我想要换成是处理窗口活动的事件:在窗口改变或者窗口创建
LRESULT Result = CallNextHookEx(Hook,nCode,wParam,lParam);
if(nCode == HCBT_ACTIVATE||nCode==HCBT_MINMAX||nCode==HCBT_MOVESIZE)//nCode==HCBT_CREATEWND||nCode==HCBT_DESTROYWND包含在其中了,不需要了
{//如果窗口有所改变,产生这几个消息时,wParam中是待改变窗口句柄
//发送消息给主程序
hwnd = FindWindow("CServerDlg",NULL);//因为窗口标题总是更换,所示不能用作寻找依据
//PostMessage(HWND_BROADCAST,WM_CP,0,0);//这样没有发送到server,这时发送广播消息的方式
if(hwnd)
PostMessage(hwnd,WM_CP,0,0);
}