C++ 键盘挂钩 CTRL 键卡住
C++ keyboard hook CTRL key gets stuck
我正在寻找重写 ctrl+c 和 ctrl+v 在我的 Windows 10 机器上添加一些额外的功能。
我能够正确复制和粘贴,并成功创建了一个键盘钩子来在按下这些键后执行我的代码,但我在按下 ctrl[=26= 后遇到了问题] 当我的程序是 运行 时,ctrl 会持续运行,就像它被按住一样。即使在我完全终止该程序后,ctrl 仍继续表现得好像它被按住一样,直到我完全注销计算机。我该怎么做才能纠正这个问题?
谢谢!
编辑:经过一番摸索之后,我可以得出任何键都卡住了的结论。 Shift 和大写锁定也会卡住。
#include <Windows.h>
#include <stdio.h>
#include <queue>
using namespace std;
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam;
if (wParam == WM_KEYDOWN) {
if (p->vkCode == 0x43 && GetKeyState(VK_CONTROL) & 0x8000) { // ctrl-c is pressed
WM_COPY;
}
else if (p->vkCode == 0x56 && GetKeyState(VK_CONTROL) & 0x8000) { // ctrl-v is pressed
OpenClipboard(NULL);
char* buffer;
buffer = (char*)GetClipboardData(CF_TEXT);
CloseClipboard();
cout << buffer;
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
}
int main()
{
HHOOK keyBoard = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, NULL);
MSG msg;
while (!GetMessage(&msg, NULL, NULL, NULL)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
UnhookWindowsHookEx(keyBoard);
}
不要将 return CallNextHookEx(NULL, nCode, wParam, lParam)
放在 if (wParam == WM_KEYDOWN)
中。
修改:
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam;
if (wParam == WM_KEYDOWN) {
if (p->vkCode == 0x43 && GetKeyState(VK_CONTROL) & 0x8000) { // ctrl-c is pressed
WM_COPY;
}
else if (p->vkCode == 0x56 && GetKeyState(VK_CONTROL) & 0x8000) { // ctrl-v is pressed
OpenClipboard(NULL);
char* buffer;
buffer = (char*)GetClipboardData(CF_TEXT);
CloseClipboard();
cout << buffer;
}
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
我正在寻找重写 ctrl+c 和 ctrl+v 在我的 Windows 10 机器上添加一些额外的功能。
我能够正确复制和粘贴,并成功创建了一个键盘钩子来在按下这些键后执行我的代码,但我在按下 ctrl[=26= 后遇到了问题] 当我的程序是 运行 时,ctrl 会持续运行,就像它被按住一样。即使在我完全终止该程序后,ctrl 仍继续表现得好像它被按住一样,直到我完全注销计算机。我该怎么做才能纠正这个问题?
谢谢!
编辑:经过一番摸索之后,我可以得出任何键都卡住了的结论。 Shift 和大写锁定也会卡住。
#include <Windows.h>
#include <stdio.h>
#include <queue>
using namespace std;
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam;
if (wParam == WM_KEYDOWN) {
if (p->vkCode == 0x43 && GetKeyState(VK_CONTROL) & 0x8000) { // ctrl-c is pressed
WM_COPY;
}
else if (p->vkCode == 0x56 && GetKeyState(VK_CONTROL) & 0x8000) { // ctrl-v is pressed
OpenClipboard(NULL);
char* buffer;
buffer = (char*)GetClipboardData(CF_TEXT);
CloseClipboard();
cout << buffer;
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
}
int main()
{
HHOOK keyBoard = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, NULL);
MSG msg;
while (!GetMessage(&msg, NULL, NULL, NULL)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
UnhookWindowsHookEx(keyBoard);
}
不要将 return CallNextHookEx(NULL, nCode, wParam, lParam)
放在 if (wParam == WM_KEYDOWN)
中。
修改:
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam;
if (wParam == WM_KEYDOWN) {
if (p->vkCode == 0x43 && GetKeyState(VK_CONTROL) & 0x8000) { // ctrl-c is pressed
WM_COPY;
}
else if (p->vkCode == 0x56 && GetKeyState(VK_CONTROL) & 0x8000) { // ctrl-v is pressed
OpenClipboard(NULL);
char* buffer;
buffer = (char*)GetClipboardData(CF_TEXT);
CloseClipboard();
cout << buffer;
}
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}