Win32api的keybd_event()函数问题
Win32api's keybd_event() function problems
我在使用 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 中,代码尝试按 而不是向上箭头键,而是数字键盘向上 (8) 键 ,无论数字锁定是打开还是关闭。
这很奇怪,因为这两个输入在游戏中做了不同的事情:第一段代码显然是按下向上箭头键(但没有松开它)而第二段代码显然是向上按下小键盘( 8) 键,即使第一个参数(按哪个键)是相同的。
第一段代码有什么问题?第二段代码有什么问题?什么是好的解决方案?感谢您的宝贵时间和帮助!
我不确定为什么会这样,但随机试验我找到了使用按位或的解决方案。我部分复制的代码在这里: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
我暂时将其标记为已接受的答案,因为它有效并且没有其他答案(而且我仍然找不到任何好的文档)但是如果有人对到底发生了什么有很好的解释就在这里,那就太好了。谢谢!
我在使用 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 中,代码尝试按 而不是向上箭头键,而是数字键盘向上 (8) 键 ,无论数字锁定是打开还是关闭。
这很奇怪,因为这两个输入在游戏中做了不同的事情:第一段代码显然是按下向上箭头键(但没有松开它)而第二段代码显然是向上按下小键盘( 8) 键,即使第一个参数(按哪个键)是相同的。
第一段代码有什么问题?第二段代码有什么问题?什么是好的解决方案?感谢您的宝贵时间和帮助!
我不确定为什么会这样,但随机试验我找到了使用按位或的解决方案。我部分复制的代码在这里: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
我暂时将其标记为已接受的答案,因为它有效并且没有其他答案(而且我仍然找不到任何好的文档)但是如果有人对到底发生了什么有很好的解释就在这里,那就太好了。谢谢!