- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试编写一个简单的全局键盘钩子(Hook)程序来重定向一些键。例如,当程序执行时,我在键盘上按下'a',程序可以禁用它并模拟'b'点击。我不需要图形用户界面,只需一个控制台就足够了(保持运行)
我的计划是用global hook来捕捉按键输入,然后用keybd_event模拟键盘。但是我有一些问题。
第一个问题是程序可以正确地阻止'A',但是如果我在键盘上按一次'A',回调函数中的printf 和keybd_event 都会执行两次。所以如果我打开一个 txt 文件,我点击一次“A”,有两个“B”输入。这是为什么?
第二个问题,为什么使用WH_KEYBOARD_LL的钩子(Hook)可以在没有dll的其他进程上工作?在我写这个例子之前,我认为我们必须使用一个 dll 来制作一个全局钩子(Hook)......
#include "stdafx.h"
#include <Windows.h>
#define _WIN32_WINNT 0x050
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
BOOL fEatKeystroke = FALSE;
if (nCode == HC_ACTION)
{
switch (wParam)
{
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
case WM_KEYUP:
case WM_SYSKEYUP:
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam;
if (fEatKeystroke = (p->vkCode == 0x41)) { //redirect a to b
printf("Hello a\n");
keybd_event('B', 0, 0, 0);
keybd_event('B', 0, KEYEVENTF_KEYUP, 0);
break;
}
break;
}
}
return(fEatKeystroke ? 1 : CallNextHookEx(NULL, nCode, wParam, lParam));
}
int main()
{
// Install the low-level keyboard & mouse hooks
HHOOK hhkLowLevelKybd = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, 0, 0);
// Keep this app running until we're told to stop
MSG msg;
while (!GetMessage(&msg, NULL, NULL, NULL)) { //this while loop keeps the hook
TranslateMessage(&msg);
DispatchMessage(&msg);
}
UnhookWindowsHookEx(hhkLowLevelKybd);
return(0);
}
非常感谢!
最佳答案
由于 WM_KEYDOWN
和 WM_KEYUP
,您的回调函数执行了两次。当您按下键盘上的某个键时,Windows 将调用回调函数并发送 WM_KEYDOWN
消息,而当您释放该键时,Windows 将调用回调函数并发送 WM_KEYUP
消息。这就是你的回调函数执行两次的原因。
您应该将 switch 语句更改为:
switch (wParam)
{
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
case WM_KEYUP:
case WM_SYSKEYUP:
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam;
if (fEatKeystroke = (p->vkCode == 0x41)) //redirect a to b
{
printf("Hello a\n");
if ( (wParam == WM_KEYDOWN) || (wParam == WM_SYSKEYDOWN) ) // Keydown
{
keybd_event('B', 0, 0, 0);
}
else if ( (wParam == WM_KEYUP) || (wParam == WM_SYSKEYUP) ) // Keyup
{
keybd_event('B', 0, KEYEVENTF_KEYUP, 0);
}
break;
}
break;
}
关于你的第二个问题,我想你已经从@Ivan Danilov 那里得到了答案。
关于c++ - 带 WH_KEYBOARD_LL 和 keybd_event 的全局键盘钩子(Hook) (windows),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22975916/
我正在开发 Windows CE 的虚拟键盘,但无法使用括号或双引号(可能还有我未测试过的其他字符)发出输入事件。 我使用括号键码 0x28 和 0x29,但它根本不起作用。当我想发送一个“A”时,我
我创建了一个模拟键盘事件的小程序,用于在 Oracle 中填充数据,但是当我使用 keybd_event 引入字符下划线时,输出是错误的如果 _ 不是最后一个字符,当程序模拟下一个字符时自动添加字符
我正在尝试使用 keybd_event() 按下某些键以进入远程桌面应用程序。对于最简单的测试,我只是在远程 session 中打开记事本,并在当前用户关注记事本的情况下在本地计算机上运行调用 key
我正在尝试使用以下代码模拟回车键: keybd_event(VK_RETURN , 0, 0, 0); keybd_event(VK_RETURN , 0, KEYEVENTF_KEYUP, 0);
我正在开发一个程序,该程序需要检测用户何时按下键盘或使用鼠标,即使该程序已最小化或未获得焦点。我想我必须使用 Windows API,keybd_event (user32),但我不知道如何使用此事件
我无法让它正常工作。这应该按左键 1 秒,然后等待 10 秒,然后按右键 1 秒,依此类推: keybd_event(0x25, 0xCB, 0, 0); // press left cout #
MSDN 指出 keybd_event 已被 SendInput 取代。在重写期间,我切换到使用 SendInput...这很好除了当尝试发送 Alt 键组合时。在 Win7 64 位系统上(尚未在其
这两行代码曾经起作用(将字母 a 的键盘事件发送到当前聚焦的窗口)。我猜他们最近停止工作了,因为一些 Windows 更新了。 import win32api win32api.keybd_event
在documentation它说: KEYEVENTF_EXTENDEDKEY (0x0001):如果指定,扫描码前面有一个值为 0xE0 (224) 的前缀字节。 谁能解释一下这是什么意思? 这有什
在处理 WM_CHAR 时,是否可以在我的自定义 Win32 控件中进行检测? , 或 WM_KEYDOWN消息,击键是来自实际键盘,还是通过调用SendInput 模拟或 keybd_event类型
我希望我的程序通过 WM_KEYDOWN 发送此第三方虚拟 key VK_ALOGIN 或 0xf7。 所以我尝试以下操作: keybd_event(0xf7, 0, 0, 0); 但是接收这个键盘消
SendKeys.SendWait() 只是一个包装器,这两个代码片段是相同的吗? const int VK_ESCAPE = 0x1B; keybd_event(VK_ESCAPE, 0, 0, 0
我正在尝试使用 keybd_event 模拟 ctrl+alt+del,但它没有做任何事情,像 ctrl+esc 或 alt+tab 这样的东西可以工作,但 ctrl+alt+del 不会工作。 im
我的 friend 正在学习挪威语,我想制作一个全局热键程序来发送诸如 æ ø å 我的问题是 keybd_event 函数不允许我发送那些 key ,我似乎仅限于 virtual key codes
按'a'代码是 keybd_event(VkKeyScan(64),0,0,0); 释放关键码是 keybd_event(VkKeyScan(64),0,KEYEVENTF_KEYUP,0); 要按“
如何将所有 Unicode key 发送到“keybd_event”。 . ? 我在下面找到了'Alt + Unicode(Decimal code)'方法和C++代码 但是,我在 c# 中尝试失败了
如何模拟 Ctrl-A + Ctrl-C 使用 keybd_event? 因为我在网络浏览器表单上模拟 ctrl a + ctrl c 来复制剪贴板上的全部内容。我使用了 SendKeys.SendW
我试图阻止屏幕保护程序启动。我试过发送击键,但它们都需要按标题抓取一个窗口。如果桌面上没有打开的窗口,就没有东西可以抓取。 所以我找到了一些可能有用的东西,但我不是 C# 向导。它基于 Simulat
我正在尝试编写一个简单的全局键盘钩子(Hook)程序来重定向一些键。例如,当程序执行时,我在键盘上按下'a',程序可以禁用它并模拟'b'点击。我不需要图形用户界面,只需一个控制台就足够了(保持运行)
我的 USB 键盘上有一个 Fn 键,它允许我在键盘上启用某些功能。因此,如果我按下 Fn + F10,键盘将切换到不同的模式。 我感觉 Windows 可能无法访问我键盘上的 Fn。但是,我认为对于
我是一名优秀的程序员,十分优秀!