无法接收来自Steam和其他一些程序的击键

2024-04-25 16:54:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图跟踪用户的按键次数,但我逐渐意识到,任何与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}。在


Tags: key游戏getreturnifdefkeysall
1条回答
网友
1楼 · 发布于 2024-04-25 16:54:37

经过整整3个月的努力和多次尝试,我才发现了问题——它不是以管理员身份运行的,而Steam是。在

如果其他人无意中发现了这一点,这里是我最后得到的代码。您在脚本的开头运行elevate(),但是如果您使用的话,请确保它在freeze_support之后。在

pywin32:

def elevate(console=True):
    arg = 'forced_elevate'
    if sys.argv[-1] != arg and not win32com.shell.shell.IsUserAnAdmin():
        script = os.path.abspath(sys.argv[0])
        params = ' '.join([script] + sys.argv[1:] + [arg])
        try:
            win32com.shell.shell.ShellExecuteEx(lpVerb='runas', lpFile=sys.executable, lpParameters=params, nShow=5 if console else 0)
        except pywintypes.error:
            pass
        else:
            sys.exit(0)

C类型:

^{pr2}$

相关问题 更多 >

    热门问题