在Win32上,我想知道如何使用Perl、Python或Ruby(甚至在C中)检测是否按下了左Shift或右ALT?不仅仅是当前窗口,而是整个全局环境。例如:当我在打文档的时候,我可以按下右ALT键来启动用Ruby编写的音乐播放器,然后再按下右ALT键,它就可以暂停或停止程序。2谢谢。
llew8vvj1#
您需要设置一个低级键盘挂钩。您可以通过使用LowLevelKeyboardProc调用SetWindowsHookEx来完成此操作,然后查看是否有适当的virtual key code。有左、右shift和alt键的键码。
1dkrff032#
我相信你也可以通过GetKeyState得到一个虚拟键的状态,例如GetKeyState(VK_RSHIFT)。尽管使用Reed Copsey描述的钩子可能比轮询这个函数更适合你的目的。
83qze16e3#
如果你想知道键的当前状态 right now,你可以使用GetAsyncKeyState(),参数VK_LSHIFT或VK_RMENU分别表示左移位和右移位。确保测试结果的最高有效位,因为结果包含不止一位的信息,例如:
GetAsyncKeyState()
VK_LSHIFT
VK_RMENU
if(GetAsyncKeyState(VK_LSHIFT) & 0x8000) ; // left shift is currently down
如果你想得到按键通知而不是异步轮询,你应该监听WM_KEYDOWN窗口通知,在窗口的消息处理程序中放入如下代码:
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消息以了解键何时被释放。
WM_KEYUP
nr9pn0ug4#
使用WM_SYSKEYDOWN和WM_SYSKEYUP代替WM_KEYDOWN和WM_KEYUP;然后您可以检查它是否是VK_LSHIFT或VK_MENU等,它将在这些事件发生时捕获它们。
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); }
5条答案
按热度按时间llew8vvj1#
您需要设置一个低级键盘挂钩。您可以通过使用LowLevelKeyboardProc调用SetWindowsHookEx来完成此操作,然后查看是否有适当的virtual key code。
有左、右shift和alt键的键码。
1dkrff032#
我相信你也可以通过GetKeyState得到一个虚拟键的状态,例如GetKeyState(VK_RSHIFT)。尽管使用Reed Copsey描述的钩子可能比轮询这个函数更适合你的目的。
83qze16e3#
如果你想知道键的当前状态 right now,你可以使用
GetAsyncKeyState()
,参数VK_LSHIFT
或VK_RMENU
分别表示左移位和右移位。确保测试结果的最高有效位,因为结果包含不止一位的信息,例如:如果你想得到按键通知而不是异步轮询,你应该监听
WM_KEYDOWN
窗口通知,在窗口的消息处理程序中放入如下代码:您还必须处理
WM_KEYUP
消息以了解键何时被释放。nr9pn0ug4#
使用WM_SYSKEYDOWN和WM_SYSKEYUP代替WM_KEYDOWN和WM_KEYUP;然后您可以检查它是否是VK_LSHIFT或VK_MENU等,它将在这些事件发生时捕获它们。
6vl6ewon5#
不调度VK_LSHIFT的事件。相反,两者都通过VK_SHIFT调度。VK_LSHIFT和其他特定于左/右的事件仅适用于GetKeyState。此外,在这种情况下,使用WM_SYSKEYDOWN而不是WM_KEYDOWN也没有区别。