Функция GetKeyState не работает при проверке, нажата ли левая кнопка мыши - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь увидеть, нажата ли левая кнопка мыши, и если это так, то будет выведено You clicked У меня есть этот фрагмент кода, который будет работать при первом нажатии. После этого, однако, я должен щелкнуть правой кнопкой мыши и затем щелкнуть левой кнопкой мыши, чтобы он снова работал. Если я просто нажму левую кнопку, ничего не произойдет. Почему это?

#include <iostream>
#include <windows.h>
using namespace std;

int main()
{
    while (true)
    {
        if (GetKeyState(VK_LBUTTON) < 0) {
            cout << "clicked" << endl;
        }
    }


}

Ответы [ 3 ]

1 голос
/ 27 января 2020

GetKeyState() зависит от состояния клавиатуры вызывающего потока, которое обновляется, когда вызывающий поток обрабатывает сообщения окна клавиатуры, такие как WM_KEYDOWN и WM_KEYUP. Но ваш l oop вообще не обрабатывает никаких сообщений, поэтому GetKeyState() не работает. Это очень четко указано в документации :

Статус ключа, возвращаемый этой функцией, изменяется, когда поток читает сообщения ключа из своей очереди сообщений. Состояние не отражает состояние уровня прерывания, связанное с оборудованием. Используйте функцию GetAsyncKeyState для извлечения этой информации.

Также обратите внимание на состояния документации GetAsyncKeyState():

Функция GetAsyncKeyState работает с кнопками мыши. Однако он проверяет состояние физических кнопок мыши, а не логических кнопок мыши, на которые отображаются физические кнопки. Например, вызов GetAsyncKeyState (VK_LBUTTON) всегда возвращает состояние левой физической кнопки мыши, независимо от того, отображается ли она на левую или правую логическую кнопку мыши . Вы можете определить текущее отображение системы физических кнопок мыши на логические кнопки мыши, вызвав метод GetSystemMetrics (SM_SWAPBUTTON), который возвращает значение ИСТИНА, если кнопки мыши были поменяны местами.

С учетом сказанного попробуйте сделать следующее:

#include <iostream>
#include <windows.h>
using namespace std;

int main() {
    int vk = GetSystemMetrics(SM_SWAPBUTTON) ? VK_RBUTTON : VK_LBUTTON;
    while (true) {
        if (GetAsyncKeyState(vk) < 0) {
            cout << "clicked" << endl;
        }
    }
}
1 голос
/ 14 февраля 2020

После этого я должен щелкнуть правой кнопкой мыши и затем щелкнуть левой кнопкой мыши, чтобы он снова заработал. Если я просто нажму левую кнопку, ничего не произойдет. Почему это так?

Да, я могу воспроизвести эту проблему, если щелкнуть по клиентской области окна консоли.

Существует режим редактирования консоли , вводящий нас в заблуждение , Когда вы нажимаете на клиентскую область окна консоли, вызываете его, переходите в режим редактирования и программа останавливается. Чтобы решить эту проблему, вы можете снять флажок с « Режим быстрого редактирования » (его можно найти, щелкнув по значку в левой верхней части окна консоли, затем выберите «Свойства» -> «Параметры» -> «Изменить параметры») или нажмите строка заголовка окна консоли вместо клиентской области.

Пожалуйста, проверьте, соответствует ли это вашей ситуации.

enter image description here

0 голосов
/ 27 января 2020

Примерно такой же пример с использованием обратного вызова должен работать:

#include <iostream>
#include <windows.h>
using namespace std;
HHOOK _hook;

LRESULT _stdcall HookCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (wParam == WM_LBUTTONDOWN)
    {
        cout << "mouse down" << endl;
    }
    return CallNextHookEx(_hook, nCode, wParam, lParam);
}

void SetHook() {
    if (!(_hook = SetWindowsHookEx(WH_MOUSE_LL, HookCallback, NULL, 0)))
    {
        MessageBox(NULL, "Failed to install hook!", "Error",MB_ICONERROR);  
    }
}

void ReleaseHook() {
    UnhookWindowsHookEx(_hook);
}

int main() {
    SetHook();
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {

    }
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...