我用全局键盘钩子做了一个修改键盘按键,消息拦截一切都正常就是在发送消息的时候
SendMessage(GetActiveWindow(),WM_KEYUP,(WPARAM)"X",0);或者改成PostMessage都是一样的效果,没有响应
我换成keybd_event()就没有这个问题了,但是又出了另外一个问题就是
比如我把‘A’改成‘Z’,我按下Z的时候出现两个字符ZA,请问这是什么原因???有什么好的解决方法吗??谢谢各位大侠了

解决方案 »

  1.   

    处理完后,返回,不要让HOOK继续处理
      

  2.   

    你是回答的那个问题??是用keybd_event 出现两个字符还是SendMessage 没效果的???
      

  3.   

    钩WM_KEYDOWN、WM_KEYUP这两个消息需要钩WH_GETMESSAGE。
      

  4.   

    出现两个字符的
    keybd_event()相当于重新发送一遍键盘消息,这个消息可能不经过你的HOOK,所以导致你出现两个字符的情况,最好还是用sendmessage,至于为什么没有效果,因为你的窗口句柄不对,应该用FindWindow来获得窗口句柄
      

  5.   

    shenyi0106
     
    (飞机党飞行员) 
    我用SPY++找到的窗口时正确的,但是SendMessage还是不管用
    还有一个问题就是为什么SendMessage之后返回和调用CallNextHook结果不一样
    一个有本来的输入一个没有?
      

  6.   

    PostMessage和SendMessage要发送给焦点窗口,给GetActiveWindow是没用的,GetActiveWindow只是Retrieves the window handle to the active window attached to the calling thread's message queue.
    使用keybd_event自动给焦点窗口
    你需要在钩子过程返回非0值以阻止原来的按键消息到达目标窗口
      

  7.   

    如果要判断按键的状态,使用WH_KEYBOARD的lParam第31位或WH_KEYBOARD_LL的wParam
      

  8.   

    我刚刚试了一下,我换成了MFC下的GetActivewindow 还是不可以我觉得应该不是这个问题
      

  9.   

    GetActivewindow是肯定不可以的,MFC的GetActivewindow就是对user32.dll的GetActivewindow 的封装
    改键就应该使用SendInput或封装它的keybd_event
      

  10.   

    那如何给指定的窗口发送自定义的消息呢?
    我使用了好几种方法。
    比如说安装钩子之前,先给一个全局变量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);
    }