【发布时间】:2021-06-10 19:07:50
【问题描述】:
我正在开发一个 wxPython 应用程序来编写一个游戏的键绑定,该游戏可以将 Left-Shift、-Ctrl 和 -Alt 与 Right-Shift 等分开绑定。
我可以使用 keyEvent.ShiftDown() 等来发现 shift 是否向下,但显然我需要在 keyEvent.GetRawKeyFlags() 内部翻找有关它是左还是右的信息。文档提供了一些帮助:
在 MSW 下,原始标志只是 相应的消息。
在 GTK 下,原始标志包含 对应的 GDK 事件。
在 macOS 下,原始标志包含修饰符状态。
但是,我无法找到可能的“相应消息的 lParam 参数”值的不错列表等。我发现了几个不起作用的列表;我认为它们可能是 C# 特定的和/或过时的。
我认为我的下一步是遍历 wxWidgets C++ 代码本身,看看我是否能理解它,或者只是试错 32 位的标志,但我想我会看看是否你们都有这方面的经验,可以为我指明正确的方向。
(在下面的代码中,我知道我的 modKeyFlags 值不是远程二进制标志形的;这部分正在从“==”过渡到“&”,但我从未找到完成工作的标志列表. 我希望你能看到它试图去哪里。)
if wx.Platform == '__WXMSW__':
modKeyFlags = {
'LSHIFT': 160, 'RSHIFT': 161,
'LCTRL' : 162, 'RCTRL' : 163,
'LAlT' : 164, 'RALT' : 165,
}
elif wx.Platform == '__WXX11_':
modKeyFlags = {
'LSHIFT': 65505, 'RSHIFT': 65506,
'LCTRL' : 65507, 'RCTRL' : 65508,
'LALT' : 65513, 'RALT' : 65514
}
elif wx.Platform == '__WXMAC__':
pass
# ... more stuff, then inside event handler:
# check for each modifier key
if (event.ShiftDown()) :
if SeparateLR and modKeyFlags:
if isinstance(event, wx.KeyEvent):
rawFlags = event.GetRawKeyFlags()
if (rawFlags & modKeyFlags['LSHIFT']): self.ShiftText = "LSHIFT+"
elif (rawFlags & modKeyFlags['RSHIFT']): self.ShiftText = "RSHIFT+"
else:
self.ShiftText = "SHIFT+"
# ... checks for CTRL and ALT
关于在哪里可以找到 WXMSW、WXX11 和 WXMAC 中任何一个的关键事件的原始密钥标志的正确列表的任何信息都将非常有帮助。谢谢!
【问题讨论】:
-
您可以尝试运行
keyboard示例吗? -
我试过了,但没有 - 完全 - 对出现的两个大十进制数进行二进制数学运算。从另一个中减去一个,然后是 bin(the_difference),我突然只有几个标志可供选择,并且可以很容易地反复试验。谢谢指点!