WINDOWS键盘钩子

最近有个需求做的时候碰到需要捕获某个程序的特定按键并且在该程序处于焦点并且按下特定键(如F1)时让主板的蜂鸣器响一声以提示,由于该程序没有源码,因此只能通过编写服务挂全局钩子来对该程序的键盘消息进行捕获。

大致的代码结构是使用VC现编写了一个DLL模块(因为是全局钩子嘛),DLL模块中导出安装和卸载钩子两个函数,然后在DLL中编写钩子回调函数,如下:


LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(nCode <0)
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
if(wParam == WM_KEYDOWN)
{
KBDLLHOOKSTRUCT* pKBDllHookStruct = (KBDLLHOOKSTRUCT*)lParam;
DWORD dwvkKey = pKBDllHookStruct->vkCode;
char szProcessName[MAX_PATH] = {0};
//bool bSuccess = GetCurrentProcessName(szProcessName);  
//if(bSuccess && strcmp(szProcessName, "notepad") == 0)
//首先获取当前最前放窗体的句柄
HWND hWnd = GetForegroundWindow();
if(hWnd != INVALID_HANDLE_VALUE)
{
//获取窗体类名
char szWindowClassName[100]={0};
int n = GetClassName(hWnd, szWindowClassName, 100);
if(n > 0 && (strcmp(szWindowClassName, "Edit") == 0 || strcmp(szWindowClassName, "Notepad") == 0))
{
//被监听进程  
//调用蜂鸣器发声音
Beep(850, 500);
}
}
}
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}

然后再用BCB编写了一个服务程序,在服务启动时加载DLL并且调用钩子安装函数(DLL中导出),在停止时调用钩子卸载函数并且卸载DLL模块,另外,BCB的服务工程要设置interactive属性为true,否则,服务进程中无法捕获到桌面消息。

例子中该回调函数的作用是对记事本进行按键捕获(未指定键值)

测试中发现该回调函数是在服务的进程中被调用的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值