Крюк клавиатуры C ++ Клавиша CTRL застревает - PullRequest
0 голосов
/ 21 января 2020

Я хочу переписать ctrl + c и ctrl + v на моей Windows 10 машине добавить некоторые дополнительные функции.

Я могу правильно копировать и вставлять и успешно создал клавиатуру для выполнения моего кода после нажатия этих клавиш, но у меня возникла проблема после нажатия ctrl , пока мой программа работает, 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);
}

1 Ответ

2 голосов
/ 21 января 2020

Не помещайте 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);
}
...