python win32 简单操作
源由
刚开始是帮朋友做一个按键精灵操作旺信的脚本,写完后各种不稳定;后来看到python可以操作win32相关的api,恰好这一段时间正在学习python,感觉练手的时候到了~~~
下载
要注意Python版本及位数,否则会安装失败
直接到上面的地址去找合适的版本下载安装,已包含其它的工具
下载的已经是可执行文件,直接执行即可
https://sourceforge.net/projects/pywin32/
获取句柄的方式
- VC或VS工具里面自带SPY++,可以获取句柄信息, 这个你没有,请看下条
- 没错,就是按键精灵(不是做广告哈,第一次查找句柄信息的时候就是用这货),功能简单易用
使用
查询句柄
# 根据类名及标题名查询句柄,
hwnd = win32gui.FindWindow("Tfrm_YzzPlayer","叶子猪手游模拟器")
# 查找指定句柄的子句柄,后两个参数为子类的类名与标题,如果没有或不确定,可以写None
hwnd = win32gui.FindWindow(hwnd,None,"sub_class","sub_title")
修改窗口大小
# 没有直接修改窗口大小的方式,但可以曲线救国,几个参数分别表示句柄,起始点坐标,宽高度,是否重绘界面 ,如果想改变窗口大小,就必须指定起始点的坐标,没果对起始点坐标没有要求,随便写就可以;如果还想要放在原先的位置,就需要先获取之前的边框位置,再调用该方法即可
win32gui.MoveWindow(hwnd,20,20,405,756,True)
前台后台
# 指定句柄设置为前台,也就是激活
win32gui.SetForegroundWindow(hwnd)
# 设置为后台
win32gui.SetBkMode(hwnd, win32con.TRANSPARENT)
按键
# 在这里两几种方式可以选择 可以使用win32gui包和win32api的包,目前未深入了解,感觉是一样的,每一个里面还有PostMessage与SendMessage两都可选,依据其他文档的说法是SendMessage是同步的,在成功执行后才会返回,而PostMessage是异步执行的,直接返回,只是把内容加在队列里
# 几个参数分别为: 操作的句柄 , 按键的类型(是按下或者是弹起), 键码(大部分的功能键在win32con包中都,对于常用的数字或字母,直接去查找ASII码即可,如A 65 等等),相对于句柄中的位置(在这里需要使用win32api.MAKELONG(x,y)将两个地址转换为一个长地址;
# 在这种情况下,可以做到后台的操作
# 需要注意的是每一个按键要有按下与弹起两个过程,比果我们要按Enter键,就需要有两句代码,第二个参数分别为 KEYDOAWN与 KEYUP ,如果是组合键,就先把组合键分别按下后再分别弹起即可
# win32gui.PostMessage(tid, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
# win32gui.SendMessage(tid, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
win32api.SendMessage(hwd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, long_position)
win32api.PostMessage(hwd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, long_position)
发送消息
在这里有两种方式,一种是找到输入框的句柄,将键类型设置为SETTEXT
另外一种方式为将需要输入的内容放到粘贴板中,直接粘贴即可
# 方式一为网络上说明,自己在测试的时候一直不成功,因为我是操作安卓模拟器里面的软件,查找不到输入框的句柄的原因
win32gui.SendMessage(tid, win32con.WM_SETTEXT,None,‘hello')
# 方式二,测试通过 其实就是把内容放到剪贴板中,直接ctrl + v即可,感觉适用于找不到输入框的具体句柄,但焦点已经在输入框中的情况
# 定义两个方法,来读写剪贴板,注意要和目标系统的编码方式相同
def getText():
# 读取剪切板
w.OpenClipboard()
d = w.GetClipboardData(win32con.CF_TEXT)
w.CloseClipboard()
return d
def setText(aString):
# 写入剪切板
w.OpenClipboard()
w.EmptyClipboard()
w.SetClipboardData(win32con.CF_TEXT, aString.encode(encoding='gbk'))
w.CloseClipboard()
代码示例
下面的代码功能是:从一个文本读取每一行记录,然后到安卓模拟器中的旺信中查询联系人,发送指定内容的消息。
# coding: utf-8
import win32gui, win32api, win32con
import time
import win32clipboard as w import logging def click_position(hwd, x_position, y_position, sleep):
"""
鼠标左键点击指定坐标
:param hwd:
:param x_position:
:param y_position:
:param sleep:
:return:
"""
# 将两个16位的值连接成一个32位的地址坐标
long_position = win32api.MAKELONG(x_position, y_position)
# win32api.SendMessage(hwnd, win32con.MOUSEEVENTF_LEFTDOWN, win32con.MOUSEEVENTF_LEFTUP, long_position)
# 点击左键
win32api.SendMessage(hwd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, long_position)
win32api.SendMessage(hwd, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, long_position)
time.sleep(int(sleep)) def getText():
# 读取剪切板
w.OpenClipboard()
d = w.GetClipboardData(win32con.CF_TEXT)
w.CloseClipboard()
return d def setText(aString):
# 写入剪切板
w.OpenClipboard()
w.EmptyClipboard()
w.SetClipboardData(win32con.CF_TEXT, aString.encode(encoding='gbk'))
w.CloseClipboard() def input_content(hwd, content, sleep, is_enter):
"""
从站贴板中查找输入的内容
:param hwd:
:param content:
:param sleep:
:param is_enter 是否要在最后输入enter键,内容与enter之间间隔一秒
:return:
"""
setText(content)
time.sleep(0.3)
click_keys(hwd, win32con.VK_CONTROL, 86)
if is_enter:
time.sleep(1)
click_keys(hwd, win32con.VK_RETURN)
time.sleep(sleep) def click_keys(hwd, *args):
"""
定义组合按键
:param hwd:
:param args:
:return:
"""
for arg in args:
win32api.SendMessage(hwd, win32con.WM_KEYDOWN, arg, 0)
for arg in args:
win32api.SendMessage(hwd, win32con.WM_KEYUP, arg, 0) def wangwang_operation(hwd, salesname, content1, content2):
"""
阿里旺旺的操作
:param hwd: 句柄
:param salesname:
:param content1: 发送一
:param content2: 发送二
:return:
"""
# 下方联系人标签
click_position(hwd, 200, 685, 2)
# 新增好友按钮
click_position(hwd, 372, 44, 3)
# 搜索好友
input_content(hwd, salesname, 3, False)
# 点击搜索
click_position(hwd, 345, 117, 5)
# 点击发送消息
click_position(hwd, 350, 700, 3)
# 发送消息一
input_content(hwd, content1, 1, False)
click_keys(hwd, win32con.VK_CONTROL, win32con.VK_RETURN)
time.sleep(1)
input_content(hwd, content2, 1, False)
click_keys(hwd, win32con.VK_CONTROL, win32con.VK_RETURN)
time.sleep(1)
# 返回原始状态
click_position(hwd, 20, 45, 1)
time.sleep(1)
click_position(hwd, 20, 45, 1) def wangwang_operation_by_file(hwd, file, content1, content2):
with open(file, 'r') as f:
line = f.readline()
while len(line) >= 1:
try:
line = line.replace('\r', '').replace('\n', '')
print("正在处理 %s ....................................." % line)
wangwang_operation(hwd, line, content1, content2)
line = f.readline()
except BaseException as e:
print("处理 %s 时出错了............." % line)
logging.exception(e) if __name__ == "__main__":
# 查找句柄
hwnd = win32gui.FindWindow("Tfrm_YzzPlayer", "叶子猪手游模拟器")
if int(hwnd) <= 0:
print("没有找到模拟器,退出进程................")
exit(0)
print("查询到模拟器句柄: %s " % hwnd)
win32gui.MoveWindow(hwnd, 20, 20, 405, 756, True)
time.sleep(2)
# 屏幕坐标到客户端坐标
# print(win32gui.ScreenToClient(hwnd, (1446, 722)))
# 设置为前台
# win32gui.SetForegroundWindow(hwnd)
# 设置为后台
win32gui.SetBkMode(hwnd, win32con.TRANSPARENT)
time.sleep(2)
# 下列的后三个参数分别表示: 文件路径 打招呼句子 广告语
wangwang_operation_by_file(hwnd, "D:/2.txt", "你好", "测试广告语")
python win32 简单操作的更多相关文章
- python sqlite3简单操作
python sqlite3简单操作(原创)import sqlite3class CsqliteTable: def __init__(self): pass def linkSqlite3(sel ...
- ~~Python文件简单操作~~
进击のpython Python文件操作 在说Python的文件操作之前 我们可以先思考一个问题 平时我们是怎么对电脑中的文件进行操作的呢? 打开电脑⇨找到文件⇨打开文件⇨读文件⇨修改文件⇨保存文件⇨ ...
- python:redis简单操作
一,安装redis-py pip install redis easy_install redis 二,简单用法 import redis # 连接redis服务器 def conn_redis(): ...
- python列表-简单操作
一.下标操作(下标只能是整数,不能是浮点值) 1.用下标取值 (1)取单个值 In [69]: list01 Out[69]: [2, 3, 4, 5, 'b', 'v', 'c', 666] In ...
- Python socket简单操作
#服务端:#导入socket模块 import socket #创建socket对象,创建了一个手机 server = socket.socket() #给程序设置一个ip地址和端口号,买了个手机卡 ...
- python django简单操作
准备: pip3 install django==1.10.3 cmd django-admin startproject guest 创建一个guest的项目 cd guest manage. ...
- Python零基础入门(安装步骤,验证方式, 简单操作)
本篇文章适合新人小白初步了解Python,涵盖Python的介绍.安装以及简单的基础操作. 1.Python简介 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.它的设 ...
- python对mysql进行简单操作
python 连接MySQL数据库,进行简单操作 一.连接MySQL数据库,关闭连接 import pymysql db = pymysql.connect(host="xxx.xxx.x. ...
- 进击的Python【第十二章】:mysql介绍与简单操作,sqlachemy介绍与简单应用
进击的Python[第十二章]:mysql介绍与简单操作,sqlachemy介绍与简单应用 一.数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数 ...
随机推荐
- akka源码导读
akka的actor模型提供了强大的并发,本人就akka源码进行了详细的阅读,下面是一些体会. 1.object SystemMessageList: @tailrec private[sysmsg] ...
- 安装xp遇到的问题与如何连接共享的打印机
2013-12-5 星期四 今天下午去给曹老师鼓捣电脑去了,安装了一个xp系统,加上一些常用的办公软件,在连接上一个共享的打印机. 下面是今天我遇到的问题: 问题:安装xp系统之后,没有本地连接,只有 ...
- 使用LINQ TO XML 创建xml文档,以及读取xml文档把内容显示到GridView例子
首先,准备了一个Model类 using System; using System.Collections.Generic; using System.Linq; using System.Text; ...
- ELK系列~log4-nxlog-Fluentd-elasticsearch写json数据需要注意的几点
经验与实践 前两篇文章里我们介绍了nxlog的日志收集和转发<ELK系列~Nxlog日志收集加转发(解决log4日志换行导致json转换失败问题)>,今天我们主要总结一下,在与log4和f ...
- java对象类型转换和多态性
html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...
- ubuntu 常用命令集
一.安装的时候,让你输入代替root用户的名称与密码 使用sudo root切换root的时候会要求你输入密码,这时候你输入什么都不对的 要想使用的哈,需要给root设置密码,命令如下: sudo p ...
- maximum shortest distance
maximum shortest distance Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- Be the Winner
Be the Winner Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 面试时,当你有权提问时,别客气,这是个逆转的好机会(内容摘自Java Web轻量级开发面试教程)
前些天,我在博客园里写了篇文章,如何在面试中介绍自己的项目经验,收获了2千多个点击,这无疑鼓舞了我继续分享的热情,今天我来分享另外一个面试中的甚至可以帮助大家逆转的技巧,本文来是从 java web轻 ...
- 阿里云RDS for SQL Server使用的一些最佳实践
了解RDS的概念 这也是第一条,也是最重要的一条,在使用某项产品和服务之前,首先要了解该产品或服务的功能与限制,就像你买一个冰箱或洗衣机,通常也只有在阅读完说明书之后才能利用起来它们的所以功能,以及使 ...