将密钥发送到Python中的非活动窗口[重复]

Posted

技术标签:

【中文标题】将密钥发送到Python中的非活动窗口[重复]【英文标题】:Send keys to a inactive window in Python [duplicate] 【发布时间】:2014-03-21 23:53:49 【问题描述】:

我正在尝试在 Python 程序的另一个进程中按下一个键。我已经尝试过 win32 api,但不知何故,这段代码什么也没做:

import win32gui
import win32con
import win32api

hwnd = win32gui.FindWindow("notepad", "prueba.txt: Bloc de notas")

if(hwnd != 0):

    win32api.SendMessage(hwnd, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
    win32api.SendMessage(hwnd, win32con.WM_KEYUP, win32con.VK_RETURN, 0)

    while(True):

        win32api.SendMessage(
            hwnd,
            win32con.WM_CHAR,
            ord('x'),
            0)
else:
    print("The window is closed")

当然,我想对非活动窗口执行此操作。任何解决方案或替代方案?

谢谢

【问题讨论】:

【参考方案1】:

使用(但添加错误检查)

hwndMain = win32gui.FindWindow("notepad", "prueba.txt: Bloc de notas")
hwndEdit = win32gui.FindWindowEx( hwndMain, 0, "Edit", 0 )
win32api.PostMessage( hwndEdit,win32con.WM_CHAR, ord('x'), 0)

如果你想循环发布消息,你应该添加一些“睡眠”调用:-)

【讨论】:

谢谢你们。不接受 postmessage 的模拟器和游戏怎么办?我试过 keybd_event 但它真的很慢,因为你必须等待 0.1 秒。 如果您不能或不想使用 PostMessage WM_CHAR(或 WM_KEYDOWN),那么您就剩下 SendInput。我不知道 SendInput 需要任何“等待”;请参阅msdn.microsoft.com/en-us/library/windows/desktop/ms646310.aspx 如果发布的代码对您有用,您应该接受答案。当您有更多代表时,您也许可以对答案进行投票。 我认为 SendInput 在模拟器和游戏中不起作用:( 无论如何,如果我的代码帮助您在记事本中填写“x”,您可以接受答案:-) 如果keybd_event 有效,SendInput 也应该有效。如果SendInput 不起作用,我不知道其他解决方案。【参考方案2】:

目标窗口错误。记事本有多个窗口:它有一个带有子编辑控件的框架窗口。为了使您的代码正常工作,您应该找到一个作为编辑控件的框架的子项(= 代码中的 hwnd)并向其发送 WM_CHAR。

【讨论】:

以上是关于将密钥发送到Python中的非活动窗口[重复]的主要内容,如果未能解决你的问题,请参考以下文章

向非活动应用程序发送密钥

Python 将击键发送到非活动应用程序

似乎无法将密钥发送到调试视图

将数据从活动发送到片段android工作室[重复]

将鼠标事件发送到非活动和隐藏的窗口/WPF 窗体

将arraylist从一个活动发送到另一个活动到listview android [重复]