我正在尝试使用python将一些密钥发送到非活动窗口/进程/程序(win32 / 64)。已经阅读过关于pywinauto和SendKeys的信息,但是它们都会在发送密钥之前激活窗口。
有没有办法使用非活动窗口而不激活它?
如果有人发布简单的示例/片段,那就太好了。
感谢。
答案 0 :(得分:10)
这是一个非常古老的帖子,但这里没有答案,我正在寻找与此类似的东西,我花了6个小时浏览Stackoverflow,最后只是阅读了所有的C文档,因为它更多是有用的。
<python>
#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)
</python>
我已经看过各个帖子使用
hwndEdit = win32gui.FindWindowEx(hwndMain, hwndChild, "Edit", "test - Notepad");
但我永远无法理解。除此之外,微软网站上的所有文档都有不同的含义,所以我添加了自己的理解。
这应该让你开始,应该对别人有所帮助。如果其他人有修改,请告诉我。
答案 1 :(得分:0)
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(2月08日) 此大版本引入了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。