搞不明白你这个键盘钩子是什么作用?
是不是当你KEYIN时,引发钩子,钩子再SENDMESSAGE,然后BEEP?你把WM_KEYDOWN改为WM_CLOSE,看看,你KEYIN时会不会引发窗口关闭。

解决方案 »

  1.   

    WH_KEYBOARD 当有键盘动作时即会引发钩子
      

  2.   

    楼上说的极有道理,我自己实验了一下:
    //hook.h
    //空
    //hook.cpp
    #include "Hook.h"
    #include "windows.h"
    HWND hHookWnd;
    HHOOK MyHook;int CALLBACK KeyboardProc(int code,WPARAM wParam,LPARAM lParam)
    {
    if(PostMessage(hHookWnd,WM_CLOSE,wParam,lParam))//用SendMessage总是返回FALSE
    {
    MessageBeep(-1);
    return CallNextHookEx(MyHook,code,wParam,lParam);
    }
    else
    return FALSE;
    }
    extern "C" __declspec(dllexport) BOOL __stdcall HookBegin(HWND hWnd)
    {
    hHookWnd=hWnd;
    MyHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)&KeyboardProc,GetModuleHandle("Hook.dll"),NULL);
    if(MyHook && hHookWnd)
    {
    MessageBox(0,"启用成功!","",NULL);
    return TRUE;
    }
    else
    MessageBox(0,"启用失败!","",NULL);
    return FALSE;
    }
    extern "C" __declspec(dllexport) BOOL __stdcall HookEnd(void)
    {
    if(UnhookWindowsHookEx(MyHook))
    {
    MessageBox(0,"禁用成功!","",NULL);
    return TRUE;
    }
    else
    MessageBox(0,"禁用失败!","",NULL);
    return FALSE;
    }//HOOK。DEF
    LIBRARY "HOOK.DLL"
    DESCRIPTION ''
    EXPORTS
    HookBegin @1HookEnd  @2
    建一DIALOG工程,加一BUTTON,ONBUTTON中代码如下:
    typedef BOOL (CALLBACK *LOADHOOK)(HWND hwnd);
    typedef BOOL (CALLBACK *UNLOADHOOK)();
    HINSTANCE hDLL;
    LOADHOOK loadhook;
    UNLOADHOOK unloadhook;
    hDLL=::LoadLibrary((LPCTSTR)"hook");
    if (hDLL!=NULL)
    {loadhook=(LOADHOOK)::GetProcAddress(hDLL,"HookBegin");
     unloadhook=(UNLOADHOOK)::GetProcAddress(hDLL,"HookEnd"); if(loadhook==NULL||unloadhook==NULL)
    {::MessageBox(0,"对不起,由于系统出错,本功能不能使用!!!","Somthing Wrong",MB_OK);
     return;
    }
    loadhook(this->m_hWnd); 
    return ;
    }
    ::MessageBox(0,"对不起,由于系统出错,本功能不能使用!!!","Somthing Wrong",MB_OK);
    其中我将
    PostMessage(hHookWnd,WM_KEYDOWN,wParam,lParam))//用SendMessage总是返回FALSE
    改为
    PostMessage(hHookWnd,WM_CLOSE,wParam,lParam))//用SendMessage总是返回FALSE
      

  3.   

    你要注意:
    1、你有没有模块定义文件。DEF?或[在CPP中声明导出]
    2、调用时有关语句。
    欢迎讨论:
    E_Mail&MSN:[email protected]
      

  4.   

    改为:
    ::SetForegroundWindow(hHookWnd);
             ::keybd_event() // 参数设计见MSDN.