当前位置:首页 > Python教程 > python技巧

python win32 简单操作

源由

刚开始是帮朋友做一个按键精灵操作旺信的脚本,写完后各种不稳定;后来看到python可以操作win32相关的api,恰好这一段时间正在学习python,感觉练手的时候到了~~~

下载

要注意Python版本及位数,否则会安装失败
直接到上面的地址去找合适的版本下载安装,已包含其它的工具
下载的已经是可执行文件,直接执行即可

        
  1. https : //sourceforge.net/projects/pywin32/

获取句柄的方式

  • VC或VS工具里面自带SPY++,可以获取句柄信息, 这个你没有,请看下条
  • 没错,就是按键精灵(不是做广告哈,第一次查找句柄信息的时候就是用这货),功能简单易用

使用


查询句柄

        
  1. # 根据类名及标题名查询句柄,
  2. hwnd = win32gui . FindWindow ( "Tfrm_YzzPlayer" , "叶子猪手游模拟器" )
  3. # 查找指定句柄的子句柄,后两个参数为子类的类名与标题,如果没有或不确定,可以写None
  4. hwnd = win32gui . FindWindow ( hwnd , None , "sub_class" , "sub_title" )

修改窗口大小

        
  1. # 没有直接修改窗口大小的方式,但可以曲线救国,几个参数分别表示句柄,起始点坐标,宽高度,是否重绘界面 ,如果想改变窗口大小,就必须指定起始点的坐标,没果对起始点坐标没有要求,随便写就可以;如果还想要放在原先的位置,就需要先获取之前的边框位置,再调用该方法即可
  2. win32gui . MoveWindow ( hwnd , 20 , 20 , 405 , 756 , True )

前台后台

        
  1. # 指定句柄设置为前台,也就是激活
  2. win32gui . SetForegroundWindow ( hwnd )
  3. # 设置为后台
  4. win32gui . SetBkMode ( hwnd , win32con . TRANSPARENT )

按键

        
  1. # 在这里两几种方式可以选择 可以使用win32gui包和win32api的包,目前未深入了解,感觉是一样的,每一个里面还有PostMessage与SendMessage两都可选,依据其他文档的说法是SendMessage是同步的,在成功执行后才会返回,而PostMessage是异步执行的,直接返回,只是把内容加在队列里
  2. # 几个参数分别为: 操作的句柄 , 按键的类型(是按下或者是弹起), 键码(大部分的功能键在win32con包中都,对于常用的数字或字母,直接去查找ASII码即可,如A 65 等等),相对于句柄中的位置(在这里需要使用win32api.MAKELONG(x,y)将两个地址转换为一个长地址;
  3. # 在这种情况下,可以做到后台的操作
  4. # 需要注意的是每一个按键要有按下与弹起两个过程,比果我们要按Enter键,就需要有两句代码,第二个参数分别为 KEYDOAWN与 KEYUP ,如果是组合键,就先把组合键分别按下后再分别弹起即可
  5. # win32gui.PostMessage(tid, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
  6. # win32gui.SendMessage(tid, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
  7. win32api . SendMessage ( hwd , win32con . WM_LBUTTONDOWN , win32con . MK_LBUTTON , long_position )
  8. win32api . PostMessage ( hwd , win32con . WM_LBUTTONDOWN , win32con . MK_LBUTTON , long_position )

发送消息

在这里有两种方式,一种是找到输入框的句柄,将键类型设置为SETTEXT
另外一种方式为将需要输入的内容放到粘贴板中,直接粘贴即可

        
  1. # 方式一为网络上说明,自己在测试的时候一直不成功,因为我是操作安卓模拟器里面的软件,查找不到输入框的句柄的原因
  2. win32gui . SendMessage ( tid , win32con . WM_SETTEXT , None , hello ‘)
  3. # 方式二,测试通过 其实就是把内容放到剪贴板中,直接ctrl + v即可,感觉适用于找不到输入框的具体句柄,但焦点已经在输入框中的情况
  4. # 定义两个方法,来读写剪贴板,注意要和目标系统的编码方式相同
  5. def getText():
  6. # 读取剪切板
  7. w.OpenClipboard()
  8. d = w.GetClipboardData(win32con.CF_TEXT)
  9. w.CloseClipboard()
  10. return d
  11. def setText(aString):
  12. # 写入剪切板
  13. w.OpenClipboard()
  14. w.EmptyClipboard()
  15. w.SetClipboardData(win32con.CF_TEXT, aString.encode(encoding=‘ gbk ‘))
  16. w.CloseClipboard()

代码示例

下面的代码功能是:从一个文本读取每一行记录,然后到安卓模拟器中的旺信中查询联系人,发送指定内容的消息。

        
  1. # coding: utf-8
  2. import win32gui , win32api , win32con
  3. import time
  4. import win32clipboard as w
  5. import logging
  6. def click_position ( hwd , x_position , y_position , sleep ):
  7. """
  8. 鼠标左键点击指定坐标
  9. :param hwd:
  10. :param x_position:
  11. :param y_position:
  12. :param sleep:
  13. :return:
  14. """
  15. # 将两个16位的值连接成一个32位的地址坐标
  16. long_position = win32api . MAKELONG ( x_position , y_position )
  17. # win32api.SendMessage(hwnd, win32con.MOUSEEVENTF_LEFTDOWN, win32con.MOUSEEVENTF_LEFTUP, long_position)
  18. # 点击左键
  19. win32api . SendMessage ( hwd , win32con . WM_LBUTTONDOWN , win32con . MK_LBUTTON , long_position )
  20. win32api . SendMessage ( hwd , win32con . WM_LBUTTONUP , win32con . MK_LBUTTON , long_position )
  21. time . sleep ( int ( sleep ))
  22. def getText ():
  23. # 读取剪切板
  24. w . OpenClipboard ()
  25. d = w . GetClipboardData ( win32con . CF_TEXT )
  26. w . CloseClipboard ()
  27. return d
  28. def setText ( aString ):
  29. # 写入剪切板
  30. w . OpenClipboard ()
  31. w . EmptyClipboard ()
  32. w . SetClipboardData ( win32con . CF_TEXT , aString . encode ( encoding = ‘gbk‘ ))
  33. w . CloseClipboard ()
  34. def input_content ( hwd , content , sleep , is_enter ):
  35. """
  36. 从站贴板中查找输入的内容
  37. :param hwd:
  38. :param content:
  39. :param sleep:
  40. :param is_enter 是否要在最后输入enter键,内容与enter之间间隔一秒
  41. :return:
  42. """
  43. setText ( content )
  44. time . sleep ( 0.3 )
  45. click_keys ( hwd , win32con . VK_CONTROL , 86 )
  46. if is_enter :
  47. time . sleep ( 1 )
  48. click_keys ( hwd , win32con . VK_RETURN )
  49. time . sleep ( sleep )
  50. def click_keys ( hwd , * args ):
  51. """
  52. 定义组合按键
  53. :param hwd:
  54. :param args:
  55. :return:
  56. """
  57. for arg in args :
  58. win32api . SendMessage ( hwd , win32con . WM_KEYDOWN , arg , 0 )
  59. for arg in args :
  60. win32api . SendMessage ( hwd , win32con . WM_KEYUP , arg , 0 )
  61. def wangwang_operation ( hwd , salesname , content1 , content2 ):
  62. """
  63. 阿里旺旺的操作
  64. :param hwd: 句柄
  65. :param salesname:
  66. :param content1: 发送一
  67. :param content2: 发送二
  68. :return:
  69. """
  70. # 下方联系人标签
  71. click_position ( hwd , 200 , 685 , 2 )
  72. # 新增好友按钮
  73. click_position ( hwd , 372 , 44 , 3 )
  74. # 搜索好友
  75. input_content ( hwd , salesname , 3 , False )
  76. # 点击搜索
  77. click_position ( hwd , 345 , 117 , 5 )
  78. # 点击发送消息
  79. click_position ( hwd , 350 , 700 , 3 )
  80. # 发送消息一
  81. input_content ( hwd , content1 , 1 , False )
  82. click_keys ( hwd , win32con . VK_CONTROL , win32con . VK_RETURN )
  83. time . sleep ( 1 )
  84. input_content ( hwd , content2 , 1 , False )
  85. click_keys ( hwd , win32con . VK_CONTROL , win32con . VK_RETURN )
  86. time . sleep ( 1 )
  87. # 返回原始状态
  88. click_position ( hwd , 20 , 45 , 1 )
  89. time . sleep ( 1 )
  90. click_position ( hwd , 20 , 45 , 1 )
  91. def wangwang_operation_by_file ( hwd , file , content1 , content2 ):
  92. with open ( file , ‘r‘ ) as f :
  93. line = f . readline ()
  94. while len ( line ) >= 1 :
  95. try :
  96. line = line . replace ( ‘r‘ , ‘‘ ). replace ( ‘n‘ , ‘‘ )
  97. print ( "正在处理 %s ....................................." % line )
  98. wangwang_operation ( hwd , line , content1 , content2 )
  99. line = f . readline ()
  100. except BaseException as e :
  101. print ( "处理 %s 时出错了............." % line )
  102. logging . exception ( e )
  103. if __name__ == "__main__" :
  104. # 查找句柄
  105. hwnd = win32gui . FindWindow ( "Tfrm_YzzPlayer" , "叶子猪手游模拟器" )
  106. if int ( hwnd ) <= 0 :
  107. print ( "没有找到模拟器,退出进程................" )
  108. exit ( 0 )
  109. print ( "查询到模拟器句柄: %s " % hwnd )
  110. win32gui . MoveWindow ( hwnd , 20 , 20 , 405 , 756 , True )
  111. time . sleep ( 2 )
  112. # 屏幕坐标到客户端坐标
  113. # print(win32gui.ScreenToClient(hwnd, (1446, 722)))
  114. # 设置为前台
  115. # win32gui.SetForegroundWindow(hwnd)
  116. # 设置为后台
  117. win32gui . SetBkMode ( hwnd , win32con . TRANSPARENT )
  118. time . sleep ( 2 )
  119. # 下列的后三个参数分别表示: 文件路径 打招呼句子 广告语
  120. wangwang_operation_by_file ( hwnd , "D:/2.txt" , "你好" , "测试广告语" )

原文:http://www.cnblogs.com/417xiaoliu/p/6898419.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!