На Win32, как определить, нажата ли клавиша Shift влево или вправо с помощью Perl, Python или Ruby (или C)? - PullRequest
1 голос
/ 28 ноября 2009

На Win32 мне интересно, как определить, нажимается ли левый Shift или правый ALT с помощью Perl, Python или Ruby (или даже в C)?

Не только для текущего окна, но и для глобальной среды в целом. Пример: когда я печатаю документ, я могу нажать правую клавишу ALT, чтобы запустить музыкальный проигрыватель, написанный на Ruby, а затем снова нажать правую клавишу ALT, и она может приостановить или остановить программу. спасибо.

Ответы [ 4 ]

4 голосов
/ 28 ноября 2009

Вам необходимо установить низкоуровневую клавиатуру. Вы делаете это, вызывая SetWindowsHookEx с LowLevelKeyboardProc , а затем наблюдаете за соответствующим кодом виртуальной клавиши .

Есть коды клавиш для левой и правой клавиши Shift и Alt.

0 голосов
/ 19 июля 2014

Вместо WM_KEYDOWN и WM_KEYUP используйте WM_SYSKEYDOWN и WM_SYSKEYUP; затем вы можете проверить, является ли он VK_LSHIFT или VK_MENU и т. д., и он будет перехватывать эти события по мере их возникновения.

0 голосов
/ 28 ноября 2009

Если вы хотите узнать текущее состояние клавиш прямо сейчас , вы можете использовать GetAsyncKeyState() с аргументом VK_LSHIFT или VK_RMENU для сдвига влево и правый альт соответственно. Обязательно проверьте самый значимый бит результата, поскольку результат содержит более одного бита информации, например,

if(GetAsyncKeyState(VK_LSHIFT) & 0x8000)
    ; // left shift is currently down

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

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    switch(msg)
    {
    ...
    case WM_KEYDOWN:
        if(wparam == VK_LSHIFT)
            ; // left shift was pressed
        // etc.
        break;
    }
}

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

0 голосов
/ 28 ноября 2009

Я полагаю, что вы также можете получить статус виртуального ключа через GetKeyState, например. GetKeyState (VK_RSHIFT). Хотя использование хука, как описано Ридом Копси, вероятно, лучше подходит для ваших целей, чем для опроса этой функции.

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