我试图跟踪用户的按键次数,但我逐渐意识到,任何与Steam有关的事情,无论是客户端本身还是通过它启动的游戏,都会停止工作。如果使用GetKeyState
而不是GetAsyncKeyState
,它可以拾取键盘边缘的位,如ctrl、shift、tab、backspace、enter,但其他什么都不能。我也在少数其他程序中发现了同样的行为,比如任务管理器和Discord。在
我尝试过ctypes
和{GetKeyState
和{
同样,在IInspectable建议查看低级键盘挂钩之后,我尝试了两个不同的版本,发现它们都遇到了完全相同的问题。在
下面是一些代码来演示所有函数的问题:
import ctypes
try:
import win32api
except ImportError:
win32api = None
def get_key_press1(key):
return win32api.GetAsyncKeyState(key)
def get_key_press2(key):
return win32api.GetKeyState(key) < 0
def get_key_press3(key):
return ctypes.windll.user32.GetKeyState(key) > 1
def get_key_press4(key):
return ctypes.windll.user32.GetAsyncKeyState(key)
KEYS = {
'BACK': 8,
'TAB': 9,
'CLEAR': 12,
'RETURN': 13,
'PAUSE': 19,
'CAPSLOCK': 20,
'ESC': 27,
'SPACE': 32,
'PGUP': 33,
'PGDOWN': 34,
'END': 35,
'HOME': 36,
'LEFT': 37,
'UP': 38,
'RIGHT': 39,
'DOWN': 40,
'INSERT': 45,
'DELETE': 46,
'LWIN': 91,
'RWIN': 92,
'MENU': 93,
'NUM0': 96,
'NUM1': 97,
'NUM2': 98,
'NUM3': 99,
'NUM4': 100,
'NUM5': 101,
'NUM6': 102,
'NUM7': 103,
'NUM8': 104,
'NUM9': 105,
'MULTIPLY': 106,
'ADD': 107,
'SUBTRACT': 109,
'DECIMAL': 110,
'DIVIDE': 111,
'F1': 112,
'F2': 113,
'F3': 114,
'F4': 115,
'F5': 116,
'F6': 117,
'F7': 118,
'F8': 119,
'F9': 120,
'F10': 121,
'F11': 122,
'F12': 123,
'F13': 124,
'F14': 125,
'F15': 126,
'F16': 127,
'F17': 128,
'F18': 129,
'F19': 130,
'F20': 131,
'F21': 132,
'F22': 133,
'F23': 134,
'F24': 135,
'NUMLOCK': 144,
'SCROLLLOCK': 145,
'LSHIFT': 160,
'RSHIFT': 161,
'LCTRL': 162,
'RCTRL': 163,
'LALT': 164,
'RALT': 165,
'COLON': 186,
'EQUALS': 187,
'COMMA': 188,
'UNDERSCORE': 189,
'PERIOD': 190,
'FORWARDSLASH': 191,
'AT': 192,
'LBRACKET': 219,
'BACKSLASH': 220,
'RBRACKET': 221,
'HASH': 222,
'TILDE': 223
}
for c in list('ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'):
KEYS[c] = ord(c)
while True:
all_pressed = []
for k in KEYS:
if win32api:
if get_key_press1(KEYS[k]):
all_pressed.append((k, 1))
if get_key_press2(KEYS[k]):
all_pressed.append((k, 2))
if get_key_press3(KEYS[k]):
all_pressed.append((k, 3))
if get_key_press4(KEYS[k]):
all_pressed.append((k, 4))
if all_pressed:
print all_pressed
从计算机上的任何地方,例如,如果按“c”,就会得到[('C', 1), ('C', 2), ('C', 3), ('C', 4)]
,这表明所有4个函数都在接收它。当你把注意力集中在与蒸汽有关的事情上,却什么也没显示出来时,按这个键。如果你点击其中一个工作按钮,就会得到[('LCTRL', 2), ('LCTRL', 3)]
,这意味着只有GetKeyState
函数在拾取它。在
在过去的几个月里,我在大约30个游戏中测试了这个脚本,毫无疑问,Steam游戏是唯一没有键盘跟踪功能的游戏。我甚至刚刚下载了Factorio的独立版本来与Steam版本进行比较,它工作得非常完美。在
有什么明显的东西我遗漏了,还是有更好的方法来按键?这有点烦人,因为它应该是脚本中最简单的部分,但它却是看起来不可修复的部分。在
{{11}理想情况下,如果按下CDD键,则返回cd11}。在
经过整整3个月的努力和多次尝试,我才发现了问题——它不是以管理员身份运行的,而Steam是。在
如果其他人无意中发现了这一点,这里是我最后得到的代码。您在脚本的开头运行
elevate()
,但是如果您使用的话,请确保它在freeze_support
之后。在pywin32:
C类型:
^{pr2}$相关问题 更多 >
编程相关推荐