Не удается выйти из циклов динамически при использовании клавиатуры - PullRequest
0 голосов
/ 31 декабря 2018

У меня возникли проблемы с выходом из цикла while при использовании клавиатуры.Вот мой код:

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    PKBDLLHOOKSTRUCT key = (PKBDLLHOOKSTRUCT)lParam;
    if (wParam == WM_KEYDOWN && nCode == HC_ACTION)
    {

    }

    if (wParam == WM_KEYUP)
    {
        if (key->vkCode == VK_CAPITAL) {
            capslockState = GetKeyState(VK_CAPITAL) & 0x0001;
            myLoop(capslockState);
        }
    }
    return CallNextHookEx(keyboardHook, nCode, wParam, lParam);
}

А вот моя функция:

int myLoop(int a) {
    while (a == 1) {
        for (i = 0; i < n; i++) {
            // do some stuff
        }
        if (a == 0) {
            break;
            return 0;
        } 
        else {
            i = 0;
        }
    }
}

Я попробовал еще несколько способов достичь своей цели, но не смог этого сделать.Моя цель: я хочу открыть программу, не имеет значения, включена ли Caps Lock, если я нажму Caps Lock, она запустит мой цикл, и если я нажму ее снова, она остановится.Я каким-то образом смог сделать это, используя множество циклов и потоков «while», но он использовал почти всю мощность моего процессора.Как создать динамичный цикл, ориентированный на производительность, при использовании ввода с клавиатуры?Спасибо.

1 Ответ

0 голосов
/ 01 января 2019

Моя цель: я хочу открыть программу, не имеет значения, включен ли Caps Lock, если я нажму Caps Lock, он запустит мой цикл, и если я нажму его снова,остановимся.

Вы можете проверить следующий код, чтобы увидеть, работает ли он.

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode < 0)  // do not process message 
        return CallNextHookEx(NULL, nCode,
            wParam, lParam);

    if (wParam == VK_CAPITAL) {

        if(hThread == NULL)
            hThread = CreateThread( NULL, 0, myLoop, NULL, 0, NULL); 

        if (capslockState)
            capslockState = 0;
        else
            capslockState = 1;
    }

    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

DWORD WINAPI myLoop(LPVOID lpParam)
{
    while (1) {
        for (UINT16 i = 0; (i < n && capslockState == 1); i++) {
            // do some stuff
        }
        Sleep(100);
    }
    return 0;
}

Что я сделал основные изменения в вашем коде:

  1. Чтобы основной поток мог отвечать на сообщения и поддерживать цикл for, вам нужно создать новый поток ( CreateThread ) для запуска цикла for.
  2. Поскольку вы "не имеет значения, еслиCaps Lock включен или выключен ", поэтому нет необходимости проверять, находится ли заглушка во включенном или выключенном состоянии .
  3. Чтобы проверить, какая клавиша нажата, используйте wParam для сравнения с код виртуальной клавиши .
  4. На проблемы указывали другие.

Дополнительная справка " Использование крючков "

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