我在使用win32api创建输入时遇到了一些问题。我正在创建一个语音识别脚本,需要像所有环境中的键盘一样工作(包括全屏游戏等)。除了win32api的keybd_event()函数之外,我还尝试了其他一些解决方案,但大多数甚至都没有在全屏应用程序中注册。我使用Civilization IV作为测试程序。 Win32api的keybd_event()函数确实可以在游戏中运行,但我得到了一些奇怪的结果。我尝试了几件不同的事情:
win32api.keybd_event(win32con.VK_UP, 0, win32con.KEYEVENTF_EXTENDEDKEY, 0)
win32api.Sleep(50)
win32api.keybd_event(win32con.VK_UP, 0, win32con.KEYEVENTF_KEYUP, 0)
无论第二行还是第三行都在那里,都不起作用。它在记事本等应用程序中正确注册为向上箭头按下。在Civilization中,它正确地注册为向上箭头按下(与下面的下一个解决方案相反), 但是密钥永远不会被释放 并且它会尝试永远上升,看似无视第三条线。
win32api.keybd_event(win32con.VK_UP, 0, 0, 0)
win32api.Sleep(50)
win32api.keybd_event(win32con.VK_UP, 0, win32con.KEYEVENTF_KEYUP, 0)
有完全不同的问题。在Civilization中,无论numlock是打开还是关闭,代码都会尝试按 而不是向上箭头键,而是按numpad up(8)键 。
这很奇怪,因为这两个输入在游戏中做了不同的事情:第一个代码块明显按下向上箭头键(但不放过它),第二个代码块显然是按下小键盘up(8)键,即使第一个参数(按哪个键)是相同的。
第一块代码有什么问题?第二块代码有什么问题?什么是好的解决方案?感谢您的时间和帮助!
答案 0 :(得分:1)
我不确定为什么会这样,但随机试验我找到了一个使用按位OR的解决方案。我部分复制的代码在这里:https://msdn.microsoft.com/en-us/library/windows/desktop/ms646304%28v=vs.85%29.aspx
我的解决方案:
win32api.keybd_event(win32con.VK_UP, 0, win32con.KEYEVENTF_EXTENDEDKEY, 0) #press
win32api.Sleep(50)
win32api.keybd_event(win32con.VK_UP, 0, win32con.KEYEVENTF_EXTENDEDKEY | win32con.KEYEVENTF_KEYUP, 0) #release
我现在将此标记为已接受的答案,因为它有效并且没有其他答案,(我仍然找不到任何好的文档)但是如果有人对这里到底发生了什么有一个很好的解释那会很棒。谢谢!