使用python将一些键发送到非活动窗口

Posted

技术标签:

【中文标题】使用python将一些键发送到非活动窗口【英文标题】:Send some keys to inactive window with python 【发布时间】:2012-10-11 09:50:31 【问题描述】:

我正在尝试使用 Python 将一些键发送到非活动窗口/进程/程序 (Win32/64)。已经阅读了关于pywinautoSendKeys 的信息,但是它们都在发送密钥之前激活了窗口。

有什么方法可以在不激活的情况下使用非活动窗口?

如果有人发布一个简单的例子/sn-p,那就太好了。

【问题讨论】:

这可能会有所帮助:***.com/q/5080777/1129194 哇,我真的错过了这里的任何 cmets =) 您的示例看起来像在工作,将搜索有关 win32api.SendMessage 方法的更多信息。谢谢! 【参考方案1】:

这是一篇非常老的帖子,但这里没有答案,我一直在寻找类似的东西,我花了 6 个小时浏览 ***,最后只阅读了所有 C 文档,因为它更多有用。

#you will need the win32 libraries for this snippet of code to work, Links below
import win32gui
import win32con
import win32api
from time import sleep

#[hwnd] No matter what people tell you, this is the handle meaning unique ID, 
#["Notepad"] This is the application main/parent name, an easy way to check for examples is in Task Manager
#["test - Notepad"] This is the application sub/child name, an easy way to check for examples is in Task Manager clicking dropdown arrow
#hwndMain = win32gui.FindWindow("Notepad", "test - Notepad") this returns the main/parent Unique ID
hwndMain = win32gui.FindWindow("Notepad", "test - Notepad")

#["hwndMain"] this is the main/parent Unique ID used to get the sub/child Unique ID
#[win32con.GW_CHILD] I havent tested it full, but this DOES get a sub/child Unique ID, if there are multiple you'd have too loop through it, or look for other documention, or i may edit this at some point ;)
#hwndChild = win32gui.GetWindow(hwndMain, win32con.GW_CHILD) this returns the sub/child Unique ID
hwndChild = win32gui.GetWindow(hwndMain, win32con.GW_CHILD)

#print(hwndMain) #you can use this to see main/parent Unique ID
#print(hwndChild)  #you can use this to see sub/child Unique ID

#While(True) Will always run and continue to run indefinitely
while(True):
    #[hwndChild] this is the Unique ID of the sub/child application/proccess
    #[win32con.WM_CHAR] This sets what PostMessage Expects for input theres KeyDown and KeyUp as well
    #[0x44] hex code for D
    #[0]No clue, good luck!
    #temp = win32api.PostMessage(hwndChild, win32con.WM_CHAR, 0x44, 0) returns key sent
    temp = win32api.PostMessage(hwndChild, win32con.WM_CHAR, 0x44, 0)

    #print(temp) prints the returned value of temp, into the console
    print(temp)
    #sleep(1) this waits 1 second before looping through again
    sleep(1)

我看过所有帖子都可以使用

hwndEdit = win32gui.FindWindowEx(hwndMain, hwndChild, "Edit", "test - Notepad");

但我一直想不通。除此之外,微软网站上的所有文档都含糊不清,所以我添加了我自己的理解方式。

这应该可以帮助您入门,并且应该对其他人有所帮助。如果其他人有修订,请告诉我。

Win32 Python Library

【讨论】:

有用:这里是除“D”键之外的其他键的键码:docs.microsoft.com/en-us/windows/desktop/inputdev/… MacOS 上是否存在类似的库? You can't simulate keyboard input with PostMessage 看来,只能将文本发送到非活动窗口。其他键,例如向下箭头,不能发送到非活动窗口。【参考方案2】:

上面由 mmsvsbg / Lithian Coth 编写的漂亮代码非常棒。我确认它可以在 Intel i7 上的 Windows 10(64 位)上运行。将 win32gui(现在称为 pywin32)编译成 64 位和其他一些小东西太费时间了,但还是可行的。对于需要逐步了解通过 mmsvsbg/Lithian 运行代码的说明的人,我在此处详细说明: https://forums.whirlpool.net.au/thread/3nkwl0k9?p=-1#bottom

一个更快的选择是你可以使用一个已经编写好的库来做同样的事情,也许更多:它叫做 pywinauto: https://pywinauto.github.io/

Pywinauto pywinauto 是一个用纯 Python 编写的 GUI 自动化库,为 Windows GUI 开发。在最简单的情况下,它允许您将鼠标和键盘操作发送到 Windows 和 Linux 上的对话框和控件,而目前仅在 Windows 上支持更复杂的基于文本的操作(Linux AT-SPI 支持正在开发中)。

pywinauto 0.6.0(10 月 31 日)和 0.6.1(08 年 2 月) 这个大版本引入了 MS UI 自动化 (UIA) 支持(WinForms、WPF、Qt、浏览器、商店应用程序等)。 现在在 ReadTheDocs 上不断构建文档。另请参阅我们改进的入门指南 现在可以在任何窗口上下文之外使用模块键盘和鼠标。它们也可以在 Linux 上运行! 多后端架构允许添加新的平台支持。只需实现两个类并注册您的后端! 代码风格更接近 PEP8:ClickInput -> click_input。虽然 backend='win32' 与 pywinauto 0.5.4 向后兼容约 80%。 win32_hooks 模块的初始实现。可以在系统中注册键盘事件(也称为热键)和鼠标操作处理程序。示例:hook_and_listen.py。

【讨论】:

以上是关于使用python将一些键发送到非活动窗口的主要内容,如果未能解决你的问题,请参考以下文章

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

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

将击键发送到 PowerPoint 窗口

delphi 中怎么向一个非活动窗口发送组合键

使用 Python 将按键发送到不同的窗口

Qt 将给定的键发送到活动的应用程序