在不禁用其密钥的情况下注册全局热键
Registering a Global HotKey without disabling its key
我想做一个程序,即使它在任何时刻都不活跃,也能捕获键盘事件。钩子太复杂了,我需要做的所有事情才能让它工作(制作 DLL、读取它等),所以我决定继续使用热键。
但现在我有一个问题。注册热键会禁用键盘上的键,因此我只能将键发送到程序,而不能在任何其他程序(例如记事本)上键入。
这是我的代码:
#include <iostream>
#include <windows.h>
using namespace std;
int main(int argc, char* argv[]) {
RegisterHotKey(NULL, 1, NULL, 0x41); //Register A
MSG msg = {0};
while (GetMessageA(&msg, NULL, 0, 0) != 0) {
if (msg.message == WM_HOTKEY) {
cout << "A"; //Print A if I pressed it
}
}
UnregisterHotKey(NULL, 1);
return 0;
}
// and now I can't type A's
这个问题有没有简单的解决方案?谢谢
我会让你的程序模拟一个等于你实际执行的按键。这意味着:
- 你按"A"。
- 程序捕获"A"。
- 该程序模拟按键。
这很简单。唯一的问题是您的程序也会捕获模拟的按键。要避免这种情况,您可以执行以下操作:
- 你按"A"。
- 程序捕获"A"。
- 程序取消注册热键。
- 该程序模拟按键。 (
- 程序不会(!)捕获"A"。
- 程序再次注册热键。
这就是整个循环。
现在,要模拟按键,您需要添加一些额外的代码。看看这个:
#include <iostream>
#include <windows.h>
using namespace std;
int main(int argc, char* argv[]) {
RegisterHotKey(NULL, 1, 0, 0x41); //Register A; Third argument should also be "0" instead of "NULL", so it is not seen as pointer argument
MSG msg = {0};
INPUT ip;
ip.type = INPUT_KEYBOARD;
ip.ki.wScan = 0;
ip.ki.time = 0;
ip.ki.dwExtraInfo = 0;
ip.ki.wVk = 0x41; //The key to be pressed is A.
while (GetMessage(&msg, NULL, 0, 0) != 0) {
if (msg.message == WM_HOTKEY) {
UnregisterHotKey(NULL, 1); //Prevents the loop from caring about the following
ip.ki.dwFlags = 0; //Prepares key down
SendInput(1, &ip, sizeof(INPUT)); //Key down
ip.ki.dwFlags = KEYEVENTF_KEYUP; //Prepares key up
SendInput(1, &ip, sizeof(INPUT)); //Key up
cout << "A"; //Print A if I pressed it
RegisterHotKey(NULL, 1, 0, 0x41); //you know...
}
}
UnregisterHotKey(NULL, 1);
return 0;
}
我试过了,它工作正常,我猜。希望我能帮助;)
相关文章:
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 在未初始化映射的情况下,将值插入到映射的映射中
- 是默认情况下分配给char数组常量的值
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在已经使用Git的情况下减少编译时间
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 如何在没有信号的情况下从C++执行QML插槽
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 为什么在某些情况下不写入此文件?
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- 如何在不使用任何数据库的情况下制作动态注册表单?
- 如何在不注册对象的情况下访问标准项模型的数据?
- 在不禁用其密钥的情况下注册全局热键
- 为什么 COM 类需要构造函数?如何在不注册的情况下使用 COM 类
- 注册表功能在某些情况下不工作
- 如何在c++中不绑定lua的情况下将成员函数注册到lua
- 如何在不注册dll的情况下对c++ COM代码进行单元测试?