【问题标题】:Win32api's keybd_event() function problemsWin32api的keybd_event()函数问题
【发布时间】:2015-10-21 05:22:46
【问题描述】:

我在使用 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)键,即使第一个参数(按下哪个键)是相同的。

第一段代码有什么问题?第二段代码有什么问题?什么是好的解决方案?感谢您的时间和帮助!

【问题讨论】:

    标签: python python-2.7 input keyboard pywin32


    【解决方案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
    

    我现在将其标记为已接受的答案,因为它有效并且没有其他答案,(而且我仍然找不到任何好的文档)但是如果有人对这里发生的事情有一个很好的解释那么那就太好了。谢谢!

    【讨论】:

    • 这对我在英雄联盟中不起作用。有什么想法吗?
    • @Pepijn 我从来没有弄清楚为什么上面的工作,或者为什么原始问题中的两段代码不起作用/为什么它们会导致这种奇怪的行为。你试过这两个吗?也许尝试将三段代码(原始两段和我的工作段)结合起来?抱歉,我无法提供更多帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 2013-09-10
    相关资源
    最近更新 更多