需要安装: pip install pywin32 pip install pynput pip install pillow 下载:spy++工具,直接运行spyxx_amd64.exe即可。通过拖放查找标题和类名。 代码如下: # coding = utf-8 import win32api import win32gui import win32con import win32clipboard as clipboard import time #from pynput.mouse import Button, Controller as mController from pynput.keyboard import Key, Controller as kController from PIL import Image from io import BytesIO #python3,新增字节流 #mouse = mController() keyboard = kController() #print(type(keyboard)) #####################以下为QQ发送消息部分============== # #定义指定图片文件复制到剪贴板函数 def pic_ctrl_c(pathfile): img = Image.open(pathfile) output = BytesIO()#如是StringIO分引起TypeError: string argument expected, got 'bytes' img.convert("RGB").save(output, "BMP")# 以BMP格式保存流 data = output.getvalue()[14:]#bmp文件头14个字节丢弃 output.close() clipboard.OpenClipboard() #打开剪贴板 clipboard.EmptyClipboard() #先清空剪贴板 clipboard.SetClipboardData(win32con.CF_DIB, data) #将图片放入剪贴板 clipboard.CloseClipboard() return # #查找QQ(TIM)窗口,发送人双击,激活为单独窗口 title_name='天空' win = win32gui.FindWindow('TXGuiFoundation',title_name) print("找到句柄:%x" % win) if win!=0: left, top, right, bottom = win32gui.GetWindowRect(win) print(left, top, right, bottom)#最小化为负数,有时可以发 win32gui.SetForegroundWindow(win) else: print('请注意:找不到【%s】这个人(或群),请激活窗口!'%title_name) # # #定义文本信息 str1='你好,这是QQ文本自动发送测试。' # clipboard.OpenClipboard()#将信息缓存入剪贴板 # clipboard.EmptyClipboard() # clipboard.SetClipboardData(win32con.CF_UNICODETEXT,str1) # clipboard.CloseClipboard() # # #读取BMP图片文件发送,只读bmp可以用 # from ctypes import windll # filename='D:/2018bigdata/test2.bmp' # bmp_id= windll.user32.LoadImageW(0, filename, win32con.IMAGE_BITMAP, 0, 0, win32con.LR_LOADFROMFILE) # print(filename,type(bmp_id),bmp_id) # if bmp_id != 0: ## 由于图片编码问题 图片载入失败的话 bmp_id就等于0 # clipboard.OpenClipboard() # clipboard.EmptyClipboard() # clipboard.SetClipboardData(win32con.CF_BITMAP, bmp_id) # clipboard.CloseClipboard() # time.sleep(1)#缓冲时间 # #粘贴到发送区域 input_file='D:/2018bigdata/jz2018tv.png'#要发送的图片文件 pic_ctrl_c(input_file) time.sleep(1) win32api.PostMessage(win,win32con.WM_PASTE,0, 0)#相当于CTRL V keyboard.type(str1) # 发送字符串消息,需要pip install pynput time.sleep(1)#缓冲时间 # #如果QQ回车发送,以下单独回车 # win32gui.SendMessage(win,win32con.WM_KEYDOWN,win32con.VK_RETURN,0) # #以下为“CTRL+回车”组合键发送 win32api.keybd_event(17,0,0,0)#有效,按下CTRL time.sleep(1)#需要延时 win32gui.SendMessage(win,win32con.WM_KEYDOWN,13,0)#窗口回车代码:win32con.VK_RETURN win32api.keybd_event(17,0,win32con.KEYEVENTF_KEYUP,0)#放开CTRL # #其它 #win32api.keybd_event(8,0,0,0)#代表当前环境,有效 #win32api.keybd_event(8,0,win32con.KEYEVENTF_KEYUP,0) # #win32api.keybd_event(13,0,0,0)#当前环境回车有效 #####################################################QQ发送结束====== ############################################其它资料############## # 键盘键与虚拟键码对照表 # # 字母和数字键 数字小键盘的键 功能键 其它键 # 键 键码 键 键码 键 键码 键 键码 # A 65 0 96 F1 112 Backspace 8 # B 66 1 97 F2 113 Tab 9 # C 67 2 98 F3 114 Clear 12 # D 68 3 99 F4 115 Enter 13 # E 69 4 100 F5 116 Shift 16 # F 70 5 101 F6 117 Control 17 # G 71 6 102 F7 118 Alt 18 # H 72 7 103 F8 119 Caps Lock 20 # I 73 8 104 F9 120 Esc 27 # J 74 9 105 F10 121 Spacebar 32 # K 75 * 106 F11 122 Page Up 33 # L 76 + 107 F12 123 Page Down 34 # M 77 Enter 108 -- -- End 35 # N 78 - 109 -- -- Home 36 # O 79 . 110 -- -- Left Arrow 37 # P 80 / 111 -- -- Up Arrow 38 # Q 81 -- -- -- -- Right Arrow 39 # R 82 -- -- -- -- Down Arrow 40 # S 83 -- -- -- -- Insert 45 # T 84 -- -- -- -- Delete 46 # U 85 -- -- -- -- Help 47 # V 86 -- -- -- -- Num Lock 144 # W 87 # X 88 # Y 89 # Z 90 # 0 48 # 1 49 # 2 50 # 3 51 # 4 52 # 5 53 # 6 54 # 7 55 # 8 56 # 9 57 #########################################
走了弯路1.安装pywinauto
pip install pywinauto
安装了3个组件,大小:368K+184K。
>>>from pywinauto.application import Application
出现错误:ModuleNotFoundError: No module named 'win32api'
pip install pywin32
大小:9.1M,重启python,成功。
2.连接正在运行的进程
进程PID查看:启动任务管理器>>性能>>资源监视器
>>> app = Application().connect(process=24124)
失败:32-bit application should be automated using 32-bit Python (you use 64-bit Python)
改为:app = Application(backend="uia").connect(process=24124),成功。
查看微信进程:
>>> app = Application(backend="uia").connect(process=9296)
这句更好>>> app = Application(backend="uia").connect(title_re="微信")
>>> app.YourDialog. print_control_identifiers()
Control Identifiers:
Dialog - '微信' (L0, T0, R0, B0)
['Dialog', '微信', '微信Dialog']
child_window(title="微信", control_type="Window")
打开窗口:
>>> app.dlg.print_control_identifiers()
Control Identifiers:
Dialog - '微信' (L33, T63, R1007, B862)
['Dialog', '微信', '微信Dialog']
child_window(title="微信", control_type="Window")
|
| Pane - '' (L13, T43, R1027, B882)
| ['', 'Pane', 'Pane0', 'Pane1', '0', '1']
|
| Pane - 'ChatContactMenu' (L-10000, T-10000, R-9999, B-9999)
| ['ChatContactMenuPane', 'Pane2', 'ChatContactMenu']
| child_window(title="ChatContactMenu", control_type="Pane")
| |
| | Pane - '' (L-10019, T-10019, R-9980, B-9980)
| | ['2', 'Pane3']
关闭窗口会出现错误。可用细节很少。