环境:python 3.7.x,windows7

使用的模块:pyautogui, win32gui

使用的工具:WindowSpy++

背景:最近要用帮同学处理400+张图片的文字识别,考虑用python实现 [天若OCR] 的批处理,临时抱佛脚学了一些东西,过程磕磕绊绊的,就记录一下。

1. 鼠标键盘动作模拟的模块(包)选择

百度到的键鼠模拟包主要有PyUserInputpyautogui两个包可选,具体如下:

  PyUserInput: 集成了py3.x之前的pymouse和pykeyboard等模块,需要先安装pyHook环境,之后可以pip install PyUserInput

  pyautogui:  windows下可直接pip install pyautogui

两者都可以实现丰富的键鼠操作,但我在尝试UserInput的时候遇到了一些问题:不同系统的键盘名称有区别,但不太好找到windows对应的键盘名称表。

多次尝试无果后,我就选择了pyautogui,它功能与UserInput无异、可以直接使用pip安装,还能很方便地找到一些函数和按键的快查表(如 https://blog.csdn.net/ibiao/article/details/77859997 - "pyautogui (一)")。

* 在使用pyautogui的过程中,我遇到了一些问题,如反复使用pyautogui.hotkey('ctrl','v')来模拟Ctrl+V热键的时候,有一定的概率出错。我的解决方式是十分笨拙的手动模拟:

1 import pyautogui as pg
2
3 pg.keyDown('ctrl')
4 pg.press('v')
5 pg.keyUp('ctrl')

2.多窗口下切换前置窗口

本着少做调查研究的原则,我本来是打算用模拟键盘alt+tab的方法直接实现切换窗口的,甚至计算了多个窗口下置换前置的排列组合方法。但是……天若OCR是一个联网才能使用的工具,在 [识别 - 跳出结果窗口] 的时间里,窗口的排列顺序是不确定的,所以多次反复的tab下结果总是不稳定……于是最终还是使用了win32。

论坛里关于使用win32将需要的窗口前置以方便模拟操作的攻略很少,这也是我写这一篇的动机。其实有非常简单的实现方法:

  ①确认需要前置的窗体信息:

    告诉win32前置窗体之前,我们需要得到这个窗体的信息。各种论坛中获取窗体信息的方法主要有使用win32的代码、使用WindowsSpy++、使用按键精灵等。尝试后我觉得WindowsSpy++是最好入门的。这是一款安装和使用的傻瓜机器,点击窗体就能直接看到窗体句柄(窗体的ID)、窗体标题、窗体类名等等信息。窗体句柄和标题(比如图片查看器)是经常会变动的,网友们有各种各样的方法来实时获取窗体句柄,而这里我…………为了偷懒,在窗体关系并不复杂的前提下,我选择了用窗体类名而不是句柄或窗体标题来直接区别不同窗体

    如批量OCR过程中需要前置操作的窗口有[图片查看器]和[文本编辑器],通过WindowsSpy++我得到:记事本的窗体类名是notepad,而Windows照片查看器的窗体类名是Photo_Lightweight_Viewer。

  ②使用win32前置窗体:

    如定义函数,前置[记事本]的代码如下:

1 import win32gui
2
3 def fore_text():
4     #描述类名
5     cla = 'Notepad'
6     #利用方法,通过类名找到窗体句柄
7     ctjb = win32gui.FindWindow(cla,None)
8     #利用方法,通过窗体句柄前置窗体
9     win32gui.SetForegroundWindow(ctjb)    

*  win32gui.FindWindow()函数的信息如下:

(转载自https://blog.csdn.net/guangyinglanshan/article/details/77847952,"如何利用Python和win32编程避免重复性体力劳动(一)——开始、FindWindow和FindWindowEx")

3.案例的程序实现

虽然折腾了很久,但这个批量应用天若OCR的小脚本最后显得非常简单……具体代码如下:

 1 import pyautogui as pg
 2 import time
 3 import win32gui
 4
 5 pg.PAUSE = 1.0
 6
 7 #window ranges
 8 def fore_picView():
 9     cla = 'Photo_Lightweight_Viewer'
10     hld = win32gui.FindWindow(cla,None)
11     win32gui.SetForegroundWindow(hld)
12
13 def fore_text():
14     cla = 'Notepad'
15     hld = win32gui.FindWindow(cla,None)
16     win32gui.SetForegroundWindow(hld)
17
18
19 ## make sure TianRuo is open
20
21 ###########
22 fore_picView()
23
24 for i in range(0,100):
25
26
27     #F4
28     pg.press('f4')
29
30     #choose rec
31     pg.click(650,400)
32     time.sleep(2.0)
33
34     #change window
35     fore_text()
36
37
38     #Ctrl_V
39     pg.keyDown('ctrl')
40     pg.press('v')
41     pg.keyUp('ctrl')
42     pg.press('enter')
43     pg.press('enter')
44
45     #change window
46     fore_picView()
47
48     pg.press('right')

转载于:https://www.cnblogs.com/hammmmmm/p/10963726.html

多窗口下的批量操作脚本 - 利用win32gui和WindowSpy++简单实现目标窗口前置相关推荐

  1. 在机械狗上利用AstraPro3D深度摄像头简单实现目标跟踪和人体姿态识别

    本次任务是将AstraPro3D摄像头和机械狗运用起来,AstraPro为奥比中光开发的3D传感摄像头,机械狗是云深处绝影mini,过程中主要运用到了AstraSDK做骨架提取,ros系统控制机械狗和 ...

  2. python命令提示符窗口在哪里_详解python命令提示符窗口下如何运行python脚本

    以arcgispro的python脚本为例在arcgispro自带的python窗口下运行python脚本 需求: 将arcgispro的.aprx项目包中gdb的数据源路径更换为sde数据源路径. ...

  3. 如何在CLI命令行下运行PHP脚本,同时向PHP脚本传递参数?

    如何在命令行下运行PHP脚本[带参数] 创建一个简单的文本文件,其中包含有以下PHP代码,并把它保存为hello.php: <?php echo "Hello from the CLI ...

  4. Unix/Linux下的Curses库开发指南——第三章curses库窗口

    第3 章 curses 库窗口 3 .1 curses 窗口简介 3.1.1窗口概念 窗口是 curses 库中最重要的一个组件,它实际上是屏幕上的一块矩形区域,在上面我们可以进行各种输出以及操作. ...

  5. mysql阿里云不显示中文乱码_MySQL命令窗口下中文显示乱码的解决过程

    MySQL命令窗口下中文显示乱码的解决过程 在dos客户端输出窗口中查询表中的数据,还有项目部署到服务器上时前台的页面,中文数据都显示成乱码,如下图所示: 这个问题困扰了我一天,后来解决了才发现原来我 ...

  6. linux下并行运行脚本与让程序可靠运行

    1 使程序可靠运行 linux下远程进行命令执行时 可能由于网络问题,使得终端窗口被断开,导致终端内子命令执行失败. 为什么ssh断开后你运行的进程会退出呢? 因为所有进程都得有个父进程.当你ssh到 ...

  7. python控制windows窗口、并输入数据_python win32api win32gui win32con 窗口句柄 发送消息 常用方法 键盘输入...

    import win32gui import win32con import win32api # 从顶层窗口向下搜索主窗口,无法搜索子窗口 # FindWindow(lpClassName=None ...

  8. 【RMAN】RMAN脚本中使用替换变量--windows 下rman全备脚本

    [RMAN]RMAN脚本中使用替换变量--windows 下rman全备脚本 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也 ...

  9. python控制手机自动刷新闻_Python脚本利用adb进行手机控制的方法

    一. adb 相关命令: 1. 关闭adb服务:adb kill-server 2. 启动adb服务 adb start-server 3. 查询当前运行的所有设备 adb devices 4. 可能 ...

  10. python变成exe后启动弹出选文件窗口_通过.py脚本执行的.exe文件隐藏控制台窗口...

    我试图隐藏从EXE文件弹出的控制台窗口.我正在从我自己的EXE(一个Python脚本冻结通过PyInstaller)运行这个EXE.在 我发现,每当我通过IDLE或PyCharm运行脚本时,我都可以隐 ...

最新文章

  1. java中executeQuery()方法
  2. Kotlin 协程:简单理解 runBlocking, launch ,withContext ,async,doAsync
  3. 【设计模式】前端控制器模式
  4. 二十万字!耗时90天
  5. Django ModelForm 组件的应用
  6. 系统架构师考试知识点mp3资料免费下载
  7. Faster R-CNN理解、讨论
  8. Asp.Net生命周期系列二
  9. UVa12633-Super Rooks on Chessboard-容斥+FFT
  10. python中代码段的标志是什么车_请问这段Python代码是什么意思?
  11. fopen php 读取_PHP使用fopen与file_get_contents读取文件实例分享
  12. oracle 10g 还原表格,oracle 10g 闪回表恢复
  13. java sqlexec_java 执行Sql文件
  14. 国产特斯拉遭疯狂吐槽:涨价、车尾带汉字标、续航打折扣
  15. std::map的KEY如果是char*,必须是malloc的
  16. (转)智能投顾面临的法律合规问题及国际监管经验
  17. 根的存在定理(零点存在定理)
  18. 企业信息化互联网转型“生死劫”
  19. 西安邮电大学第五届ACM-ICPC校赛(同步赛)
  20. Java Callable接口应用举例

热门文章

  1. 字写得难看,是什么原因
  2. 外测要做好测试记录,并照相保留证据
  3. WORD的一个BUG
  4. 不同机器,打印速度相差巨大
  5. 2021-0316:梦中明白在作梦
  6. 管理新语:员工随口回答,并不是有意忽悠,而是都这样
  7. 各种语言支持wasm的情况
  8. Freeswitch在内网,由服务器防火墙映射出来,IMSDROID作为被叫的问题
  9. LINUX下载编译libogg
  10. 安装和运行,意思差异应该很明显