在Win32上,如何使用Perl、Python或Ruby(或C)检测是否按下了左Shift或右Alt?

kx1ctssn  于 2023-03-08  发布在  Ruby
关注(0)|答案(5)|浏览(216)

在Win32上,我想知道如何使用Perl、Python或Ruby(甚至在C中)检测是否按下了左Shift或右ALT?
不仅仅是当前窗口,而是整个全局环境。例如:当我在打文档的时候,我可以按下右ALT键来启动用Ruby编写的音乐播放器,然后再按下右ALT键,它就可以暂停或停止程序。2谢谢。

llew8vvj

llew8vvj1#

您需要设置一个低级键盘挂钩。您可以通过使用LowLevelKeyboardProc调用SetWindowsHookEx来完成此操作,然后查看是否有适当的virtual key code
有左、右shift和alt键的键码。

1dkrff03

1dkrff032#

我相信你也可以通过GetKeyState得到一个虚拟键的状态,例如GetKeyState(VK_RSHIFT)。尽管使用Reed Copsey描述的钩子可能比轮询这个函数更适合你的目的。

83qze16e

83qze16e3#

如果你想知道键的当前状态 right now,你可以使用GetAsyncKeyState(),参数VK_LSHIFTVK_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消息以了解键何时被释放。

nr9pn0ug

nr9pn0ug4#

使用WM_SYSKEYDOWN和WM_SYSKEYUP代替WM_KEYDOWN和WM_KEYUP;然后您可以检查它是否是VK_LSHIFT或VK_MENU等,它将在这些事件发生时捕获它们。

6vl6ewon

6vl6ewon5#

不调度VK_LSHIFT的事件。相反,两者都通过VK_SHIFT调度。VK_LSHIFT和其他特定于左/右的事件仅适用于GetKeyState。此外,在这种情况下,使用WM_SYSKEYDOWN而不是WM_KEYDOWN也没有区别。

switch(msg)
    {
    ...
    case WM_KEYDOWN:
      if(wparam == VK_LSHIFT) {
         bool isLeftShift = (GetKeyState(VK_LSHIFT) < 0);
      }

相关问题