我创建了一个键盘钩子,想通过按键,来激活窗体的某个菜单选项.当该窗体处于激活状态时,可以通过键盘钩子激活某个菜单选项,执行相应的操作.但是当该窗体处于非激活状态时,菜单就不会被激活,怎么回事呢?KeybHook.cpp
#include "KeyBHook.h"#define WM_TREENOTE  WM_USER+400  //
//-----------------------------
#pragma data_seg(".SHARDAT")
static HWND   ghWndMain=0;
static HHOOK  ghKeyHook=NULL;
#pragma data_seg()HINSTANCE ghInstance=0;
HOOKPROC glpfnHookProc=0;
...
LRESULT EXPORTED_DLL_FUNCTION KbdHookProc(int nCode,WPARAM wParam,LPARAM lParam)
{
    BOOL bHandleKeystroke=FALSE;
    if(((DWORD)lParam & 0x40000000) && (HC_ACTION==nCode))  //键盘消息
    {
        switch(wParam)
        {
        case VK_F12:
               ::SendMessage(ghWndMain,WM_ACTIVATE,0,0); //给窗体发送消息
        ::SendMessage(ghWndMain,WM_TREENOTE,8,8);//给窗体发送消息
        AfxMessageBox("keyboard");
        bHandleKeystroke=TRUE;
            break;
        default:
            break;
        }
    }
return (bHandleKeystroke?TRUE : 
         ::CallNextHookEx (ghKeyHook, nCode, wParam, lParam)); //继续传递消息
}BOOL EXPORTED_DLL_FUNCTION InstallKeyboardHook(HWND hWnd)
{
    BOOL bSuccess=FALSE;
    if(!ghKeyHook)
    {
        ghWndMain=hWnd;
        glpfnHookProc=(HOOKPROC) KbdHookProc;    bSuccess=(NULL!=(ghKeyHook=::SetWindowsHookEx(WH_KEYBOARD,
                          glpfnHookProc,ghInstance,NULL)));//安装钩子    }
    return bSuccess;
}BOOL EXPORTED_DLL_FUNCTION DeInstallKeyboardHook()
{
    if(ghKeyHook)
    {
        if(TRUE==(0!=::UnhookWindowsHookEx(ghKeyHook))) //卸载钩子
        {
            ghKeyHook=NULL;
        }
    }
    return(ghKeyHook==NULL);
}
//------------------------------
BOOL CKeyBHookApp::InitInstance() 
{
    // TODO: Add your specialized code here and/or call the base class
  AFX_MANAGE_STATE(AfxGetStaticModuleState());
  ghInstance = AfxGetInstanceHandle();
  return TRUE;
}int CKeyBHookApp::ExitInstance() 
{
    // TODO: Add your specialized code here and/or call the base class
      DeInstallKeyboardHook();    return CWinApp::ExitInstance();
}

解决方案 »

  1.   

    SetWindowpos or SetForeGroundWindow
      

  2.   

    这样的东西不需要用钓子,用RegisterHotKey就可以完成了。
      

  3.   

    你可以在
    #pragma data_seg(".SHARDAT")
    static HWND   ghWndMain=0;
    static HHOOK  ghKeyHook=NULL;
    #pragma data_seg()
    后面添加这行代码:
    #pragma comment(linker,"/section:.SHARDAT,RWS")
    这样你的DLL中的这两个全局变量就编程读写共享的节了。或者,
    你在Hook.DEF(模块定义文件)中:
    LIBRARY Hook
    EXPORTS
    .....(你的导出函数)
    SEGMENTS
    .SHARDAT READ WRITE SHARED  (这里使你的节作为全局的读写共享)。