python锁定焦点到指定进程窗口的参考方法

摘要:
在使用python的过程中,我们有时会遇到这样的要求:当打开许多窗口时,我们需要将焦点锁定在一个进程的窗口上,然后对该窗口进行操作。参考代码如下。其原理是:通过获取进程的pid来遍历进程下的所有窗口。由于notepad.exe只有一个窗口,因此它可以获取一个窗口的句柄。然后调用win32gui的SetForegroundWindow,并将hwnd放在第一位。

在使用python的过程中,有时会遇到这种需求:开启了很多窗口,需要把焦点锁定到某个进程的窗口上,再对该窗口进行操作。例如:我们打开了notepad.exe和wordpad.exe应用程序,现在需要把焦点定位到notepad窗口上,在notepad窗口中进行输入。

参考代码如下,其原理为:通过获取进程的pid来遍历该进程下的所有窗口,由于notepad.exe只有一个窗口,所以可得到一个窗口的句柄。再调用win32gui的SetForegroundWindow(hwnd),把该hwnd置首。

 1 import win32con
 2 import win32gui
 3 import win32process
 4 
 5 def get_hwnds_for_pid (pid):
 6     def callback (hwnd, hwnds):
 7         if win32gui.IsWindowVisible (hwnd) and win32gui.IsWindowEnabled (hwnd):
 8             _, found_pid = win32process.GetWindowThreadProcessId (hwnd)
 9             if found_pid == pid:
10                 hwnds.append (hwnd)
11             return True
12     hwnds = []
13     win32gui.EnumWindows (callback, hwnds)
14     return hwnds
15 
16 if __name__ == '__main__':
17     import subprocess
18     import time
19     notepad = subprocess.Popen ([r"notepad.exe"])
20     #
21     # sleep to give the window time to appear
22     #
23     time.sleep (2.0)
24     print notepad.pid
25     for hwnd in get_hwnds_for_pid (notepad.pid):
26         print hwnd, "=>", win32gui.GetWindowText (hwnd)
27         win32gui.SetForegroundWindow(hwnd)

我们使用pywinauto库,其中的HwndWrapper类中有SetFocus函数,该函数在实践过程中有些情况下会失效。可修改SetFocus函数,在其开始处先尝试执行如下代码:

1 ctypes.windll.user32.SwitchToThisWindow(self.handle,True)
2 win32functions.SetFocus(self)

如果发生异常,再继续执行原来的内容。

免责声明:文章转载自《python锁定焦点到指定进程窗口的参考方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇配置定时任务清理多余的镜像和容器文件无法启动Forefront Identity Manager Service下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android ADB 端口占用问题解决方案

解决ADB端口占用问题 今天准备在准备appium的环境,突然发现自己的adb连接不上模拟机器了,试了好多次也不知道哪里出问题了, 之前用的还好好的,心想有可能是端口被占用了。 5037为adb默认端口,若5037端口被占用 步骤:1. 查看占用端口的进程PID 2. 通过PID查看所有进程 9844 是占用端口的进程的 pid 3. 杀死占用端口的进...

2.1 Linux中wait、system 分析

wait与waitpid: 当子进程退出的时候,内核会向父进程发送SIGCHID信号,子进程的退出是一个异步事件(子进程可以在父进程运行的任何时刻终止)。 子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程,它只保留最小的一些内核数据结构,以便父进程查询子进程的退出状态。 父进程查询子进程的退出状态可以用wait/waitpid函数。 当我们用f...

Django解除端口占用

Error: That port is already in use.有两个方法可以解决(假设8000端口被占用):1.使用python manage.py runserver 8001 开一个新的端口。2.kill掉原来的端口(在root条件下)。2.1 在终端输入lsof -i:8000,列出进程信息。2.2 然后,找到进程的PID号,比如我的PID号...

js前端使用jOrgChart插件实现组织架构图的展示

项目要做组织架构图,要把它做成自上而下的树形结构。  需要购买阿里云产品和服务的,点击此链接领取优惠券红包,优惠购买哦,领取后一个月内有效: https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=fp9ccf07 一、说明 (1)通过后台查询数据库,生成树形数组结构,返回到前台。...

01 psutils模块运用

python3.6.7安装脚本 baim0手撸版 #!/bin/bash cd /opt yum update -y yum -y groupinstall "Development tools" yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sql...

80端口被占用(端口检查)解决

我从会做网站到现在也遇到过了N次了,今天又让我遇到了,我来解决他,并为大家做最详细易懂的分析。 我的情况:我用了一个小插件“黑风Aspweb服务器”代替IIS,尽管如此IIS组件也是要装的。停止IIS中的“默认网站“,意味着停止了80端口的运行,然后打开“黑风Aspweb服务器”即可正常测试网站。 故障现象:今天“默认网站“已经停止,但是打开“黑风Aspwe...