python win32 简单操作方法


Posted in Python onMay 25, 2017

源由

刚开始是帮朋友做一个按键精灵操作旺信的脚本,写完后各种不稳定;后来看到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 相关文章推荐
Python中的MongoDB基本操作:连接、查询实例
Feb 13 Python
详解Python中的日志模块logging
Jun 19 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
May 25 Python
Python实现两个list求交集,并集,差集的方法示例
Aug 02 Python
Python Image模块基本图像处理操作小结
Apr 13 Python
pyqt5与matplotlib的完美结合实例
Jun 21 Python
Numpy的简单用法小结
Aug 28 Python
python使用matplotlib绘制雷达图
Oct 18 Python
Python三元运算与lambda表达式实例解析
Nov 30 Python
简单了解Django项目应用创建过程
Jul 06 Python
python的数学算法函数及公式用法
Nov 18 Python
一行代码python实现文件共享服务器
Apr 22 Python
python爬虫入门教程--利用requests构建知乎API(三)
May 25 #Python
Python正则表达式完全指南
May 25 #Python
Tensorflow简单验证码识别应用
May 25 #Python
Python 编码Basic Auth使用方法简单实例
May 25 #Python
Python 含参构造函数实例详解
May 25 #Python
Python爬虫之模拟知乎登录的方法教程
May 25 #Python
python爬虫入门教程--优雅的HTTP库requests(二)
May 25 #Python
You might like
PHP中开发XML应用程序之基础篇 添加节点 删除节点 查询节点 查询节
2010/07/09 PHP
php中解析带中文字符的url函数分享
2015/01/20 PHP
PHP动态规划解决0-1背包问题实例分析
2015/03/23 PHP
win7系统配置php+Apache+mysql环境的方法
2015/08/21 PHP
PHP使用curl制作简易百度搜索
2016/11/03 PHP
jquery 日期分离成年月日的代码
2010/05/14 Javascript
js this函数调用无需再次抓获id,name或标签名
2014/03/03 Javascript
jQuery中even选择器的定义和用法
2014/12/23 Javascript
node网页分段渲染详解
2016/09/05 Javascript
关于angular js_$watch监控属性和对象详解
2017/04/24 Javascript
详解Node 定时器
2018/02/26 Javascript
vue基于mint-ui实现城市选择三级联动
2020/06/30 Javascript
Vuex的热更替如何实现
2020/06/05 Javascript
javascript开发实现贪吃蛇游戏
2020/07/31 Javascript
[01:56]无止竞 再出发——中国军团出征2017年DOTA2国际邀请赛
2017/07/05 DOTA
Python基础语法(Python基础知识点)
2016/02/28 Python
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
2017/05/08 Python
python3.6 实现AES加密的示例(pyCryptodome)
2018/01/10 Python
使用CodeMirror实现Python3在线编辑器的示例代码
2019/01/14 Python
python 发送和接收ActiveMQ消息的实例
2019/01/30 Python
Pycharm最新激活码2019(推荐)
2019/12/31 Python
详解通过HTML5 Canvas实现图片的平移及旋转变化的方法
2016/03/22 HTML / CSS
世界上最好的儿童品牌:AlexandAlexa
2018/01/27 全球购物
Unineed中文官网:高端护肤美妆与时尚配饰,英国直邮
2020/07/23 全球购物
Ooni英国官网:披萨烤箱
2020/05/31 全球购物
医学院四年学习生活的自我评价
2013/11/06 职场文书
英语感恩演讲稿
2014/01/14 职场文书
初中校园广播稿
2014/02/02 职场文书
生产部厂长助理职位说明书
2014/03/03 职场文书
美术兴趣小组活动总结
2014/07/07 职场文书
我的中国梦演讲稿小学篇
2014/08/19 职场文书
班子个人四风问题整改措施
2014/10/04 职场文书
党员违纪检讨书怎么写
2014/11/01 职场文书
2016年校长新年寄语
2015/08/17 职场文书
基于Python实现的购物商城管理系统
2021/04/27 Python
python的html标准库
2022/04/29 Python