2023-05-19 23:07 采纳率: 20%
浏览 22
已结题

关于#python win32 后台输入问题

def send_str(text, hwnd):
    astrToint = [ord(c) for c in text]
    for item in astrToint:
        win32api.PostMessage(hwnd, win32con.WM_CHAR, item, 0)
send_str('hhhh',hwndf[0])

为什么这段代码实现不了后台输入,后台点击又可以

  • 写回答

1条回答 默认 最新

  • PythonWithCar 2023-05-20 00:51
    关注

    根据您提供的代码片段,似乎您想要通过后台发送字符串到指定窗口。然而,这段代码可能无法实现后台输入的效果,这是因为win32api.PostMessage函数发送的WM_CHAR消息通常只会被前台窗口处理。

    要实现后台输入字符串的功能,您可以考虑使用SendInput函数。下面是一个示例代码片段,演示如何使用SendInput函数进行后台输入:

    import win32api
    import win32con
    import win32gui
    import ctypes
    import time
    
    def send_str(text, hwnd):
        hwnd_foreground = win32gui.GetForegroundWindow()
        win32gui.SetForegroundWindow(hwnd)
    
        inputs = []
        for char in text:
            key_event = win32con.KEYEVENTF_UNICODE
            inputs.append(win32con.INPUT(
                type=win32con.INPUT_KEYBOARD,
                ki=win32con.KEYBDINPUT(wVk=0, wScan=char, dwFlags=key_event)
            ))
            inputs.append(win32con.INPUT(
                type=win32con.INPUT_KEYBOARD,
                ki=win32con.KEYBDINPUT(wVk=0, wScan=char, dwFlags=key_event | win32con.KEYEVENTF_KEYUP)
            ))
    
        # 输入开始前先稍作延迟,以确保窗口获得焦点
        time.sleep(0.5)
    
        # 发送输入
        nInputs = len(inputs)
        cbSize = ctypes.sizeof(win32con.INPUT)
        ctypes.windll.user32.SendInput(nInputs, ctypes.byref((win32con.INPUT * nInputs)(*inputs)), cbSize)
    
        # 恢复前台窗口焦点
        win32gui.SetForegroundWindow(hwnd_foreground)
    
    # 示例用法
    hwnd = win32gui.FindWindow(None, '窗口标题')  # 替换为目标窗口的标题
    send_str('hhhh', hwnd)
    

    这段代码使用SendInput函数来模拟键盘输入,其中每个字符都发送一个按下和释放的键盘事件。在发送输入之前,代码通过SetForegroundWindow将目标窗口设置为前台窗口,以确保窗口能够接收到输入。发送完成后,代码还会将焦点恢复到之前的前台窗口。

    请注意,为了使用这段代码,您需要安装pywin32库,并且需要根据目标窗口的特定信息(如窗口标题)进行适当的调整。

    希望这可以帮助您实现后台输入字符串的功能。如有其他问题,请随时提问。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月20日
  • 创建了问题 5月19日