我创建了一个键盘钩子,想通过按键,来激活窗体的某个菜单选项.当该窗体处于激活状态时,可以通过键盘钩子激活某个菜单选项,执行相应的操作.但是当该窗体处于非激活状态时,菜单就不会被激活,怎么回事呢?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();
}
#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();
}
#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 (这里使你的节作为全局的读写共享)。