C++键盘挂钩 CTRL 键卡住

C++ keyboard hook CTRL key gets stuck

本文关键字:CTRL 键盘 C++      更新时间:2023-10-16

我希望在我的Windows 10机器上重写ctrl +cctrl+v以添加一些附加功能。

我能够正确复制和粘贴,并成功创建了一个键盘挂钩来在按下这些键后执行我的代码,但是在我的程序运行时按 ctrl 后我遇到了问题,ctrl连续就像按住一样。即使在我完全终止程序后,ctrl仍会继续充当,就好像它被按住一样,直到我完全注销计算机。我该怎么做才能纠正这种情况?

谢谢!

编辑:在做了一些混乱之后,我可以得出结论,任何键都被卡住了。换档和大写锁定也会卡住。

#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);
}