我写的键盘HOOK程序,不能在后台捕获键盘消息。“能人”请进!
bahic 2004-12-20 01:05:00 我写的键盘HOOK程序,不能在后台捕获键盘消息。只能的主窗口活动的情况才能捕获键盘消息。
就象我写的是局部HOOK一样。
HOOK.DLL的源代码如下:
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#pragma argsused
extern "C" __declspec(dllexport) void __stdcall SetHook(HWND wnd,bool mode);
static HHOOK hkKey;
static HINSTANCE Hhinst;
static HWND hwnd;
static const MY_MSG=8000; // 自定义消息号
//=======================================================================
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
Hhinst=hinst;
return 1;
}
//-------------------------------------------------------------------------
LRESULT CALLBACK HookKey(int nCode,WPARAM wParam,LPARAM lParam)
{
if (nCode == HC_ACTION)
{
if((lParam&0xc0000000)==0xc0000000) // 有键松开
PostMessage(hwnd,MY_MSG,wParam,lParam);
}
return CallNextHookEx((HHOOK)hkKey,WH_KEYBOARD,wParam,lParam);
}
//---------------------------------------------------------------------------
void __stdcall SetHook(HWND wnd,bool mode)
{
if(mode) //安装HOOK
{
hwnd=wnd;
hkKey=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)HookKey,Hhinst,0);
}
else
{
if(hkKey)UnhookWindowsHookEx(hkKey);
}
}
//-----------------------------------------------------------------------
//我的主程序中的调用过程
void __fastcall TForm1::Button3Click(TObject *Sender)
{
static bool run=false;
static HINSTANCE hDLL; // DLL句柄
typedef void __stdcall (*DLLFUN)(HWND hwnd,bool mode);
DLLFUN SetHook;
if(!run)
{
hDLL=LoadLibrary((LPCTSTR)"HOOK.dll"); // DLL文件名:HOOK.dll
if(hDLL==NULL) { ShowMessage("DLL: 不能加载!程序退出。"); exit(1); }
SetHook =(DLLFUN)GetProcAddress(hDLL,"SetHook");
if(SetHook==NULL)
{ ShowMessage("DLL: 函数没找到!程序退出。"); FreeLibrary(hDLL); exit(1); }
SetHook(this->Handle,true);
}
else
{
SetHook(NULL,false); // 卸下HOOK
FreeLibrary(hDLL); // 卸下DLL
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,bool &Handled)
{
static const myMessage=2000;
static const SecondPar=1;
if(Msg.message==myMessage)
ShowMessage(" 收到HOOK按键消息!\n\n 【键虚拟码】:"+IntToStr(Msg.wParam));
}
//---------------------------------------------------------------------------