2401_85029454 2024-06-09 01:13 采纳率: 0%
浏览 17

pywin32使用sendmessage模拟按键,键盘无法弹起

大家,我想请教一下,pywin32中我用sendmessage模拟按下弹起键盘,但是只有按下有效是怎么回事,具体表现为比如在输入框中模拟输入a,一次按下,一次弹起,用sendmessage输入框中没有出现a,但是在游戏中用会按住a中一直走,用postmessage则会输入两个a,游戏中也一直按住a,现在电脑不在身边,只有这个图片请见谅

img

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-09 01:13
    关注

    引自免费微信小程序:皆我百晓生

    看起来你在尝试使用pywin32库中的SendMessage函数来模拟按键操作,但似乎遇到了一些问题。根据你的描述,键按下后没有弹起,这可能是因为按键消息没有正确传递给目标应用程序。

    首先,让我们检查一下你的代码。从提供的代码片段来看,存在一些语法错误和格式问题,我将修正这些问题,并提供一个简化版的示例代码。注意,这里的代码是基于你的原始意图修改的,用于模拟在活动窗口按下并释放回车键和箭头键(上)的操作。

    import time
    import win32con
    import win32api
    import win32gui
    
    def press_key(ch):
        win32api.keybd_event(ch, 0, 0, 0)  # 按下按键
        time.sleep(0.05)  # 短暂延时,确保按键被接收
        win32api.keybd_event(ch, 0, win32con.KEYEVENTF_KEYUP, 0)  # 释放按键
    
    def simulate_input():
        window = win32gui.GetForegroundWindow()
        
        # 模拟按下并释放回车键
        press_key(win32con.VK_RETURN)
    
        # 模拟按下并释放向上箭头键
        press_key(win32con.VK_UP)
    
    if __name__ == "__main__":
        simulate_input()
    

    这段代码使用了win32api.keybd_event函数,这是一个更直接的方式来模拟按键事件,而不是通过PostMessage。这样可以更容易地控制按键的按下和释放。

    如果你想要在特定的时间点触发这些操作,可以考虑使用threading.Timer来定时调用simulate_input()函数。另外,如果你想在特定的热键组合下执行这个操作,可以使用keyboard库,不过需要注意的是,它可能与pywin32的模拟方式不完全兼容,因此我在这里没有使用keyboard库。

    如果你的问题依然存在,请确认你的程序是否正确获取到了当前活动窗口(GetForegroundWindow()),以及你的操作系统和目标应用程序是否对按键消息有特殊处理。此外,如果问题仍然无法解决,你可能需要进一步调试,例如打印日志来确认消息是否正确发送,或者查看是否有其他因素干扰了按键的模拟。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月9日

悬赏问题

  • ¥100 求懂行的大ge给小di解答下!
  • ¥15 pcl运行在qt msvc2019环境运行效率低于visual studio 2019
  • ¥15 MAUI,Zxing扫码,华为手机没反应。可提高悬赏
  • ¥15 python运行报错 ModuleNotFoundError: No module named 'torch'
  • ¥100 华为手机私有App后台保活
  • ¥15 sqlserver中加密的密码字段查询问题
  • ¥20 有谁能看看我coe文件到底哪儿有问题吗?
  • ¥20 我的这个coe文件到底哪儿出问题了
  • ¥15 matlab使用自定义函数时一直报错输入参数过多
  • ¥15 设计一个温度闭环控制系统