pywin32给指定QQ发送图片和文本(python笔记)

需要安装:
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']

关闭窗口会出现错误。可用细节很少。

 

你可能感兴趣的:(pywin32给指定QQ发送图片和文本(python笔记))