pyqt win32发送QQ消息
标题应该改为:python+win32发送QQ消息,全程使用python套个pyqt壳。
其实代码来自: http://blog.csdn.net/suzyu12345/article/details/52934328
只是说明几个问题
1.在64位windows系统中不可用
虽然可获取窗体句柄,但无法使用SendMessage 发送消息
2.QQ必须处于Windows的活动状态
QQ必须处于桌面的活动状态
3.发送的消息必须临时保存在剪贴板
通过剪贴板在发送出去
win32gui.SendMessage(win, 770) 770发送来自剪贴板的内容
代码如下:
# -*- coding: utf-8 -*-
from PyQt5.QtWidgets import *
from PyQt5 import QtGui, QtCore
import sys
import win32gui
import win32con
import win32clipboard
import time class MainWidgetUI(QDialog):
def __init__(self, parent=None):
super(MainWidgetUI, self).__init__(parent)
self.setWindowIcon(QtGui.QIcon("favicon.ico"))
self.setWindowTitle('python 模拟发送QQ消息')
self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) # 在最前端
self.mainLayout = QVBoxLayout() # 水平布局
# top发送类型group布局
self.topgroupBox = QGroupBox("发送类型")
self.topLayout = QHBoxLayout(self.topgroupBox)
self.radiobtn1 = QRadioButton('搜索发送')
self.radiobtn2 = QRadioButton('直接发送')
self.topLayout.addWidget(self.radiobtn1)
self.topLayout.addWidget(self.radiobtn2) # lineEdit
self.lineEdit = QLineEdit()
self.lineEdit.setPlaceholderText('填写QQ聊天title --(昵称)') self.text = QTextEdit()
self.text.setPlaceholderText("QQ发送的内容") # 发送按钮
self.sendbtnLayout = QHBoxLayout() # 垂直布局
self.searchBtn = QPushButton(QtGui.QIcon("favicon.ico"), '发送1')
self.searchBtn2 = QPushButton(QtGui.QIcon("favicon.ico"), '发送2')
self.sendbtnLayout.addWidget(self.searchBtn2)
self.sendbtnLayout.addWidget(self.searchBtn) # mainLayout 布局
self.mainLayout.addWidget(
self.topgroupBox) # 也可以self.mainLayout.addLayout(self.topLayout) self.topLayout = QHBoxLayout() (不继承topgroupBox)
self.mainLayout.addWidget(self.lineEdit)
self.mainLayout.addWidget(self.text)
self.mainLayout.addLayout(self.sendbtnLayout)
self.setLayout(self.mainLayout) # 得到焦点
self.lineEdit.setFocus()
# 添加事件
self.searchBtn.clicked.connect(self.clickBtn) # 点击按钮
self.searchBtn2.clicked.connect(self.clickBtn)
# 初始发送类型
self.radio = False def clickBtn(self): if self.validate(): # params 验证通过
sendq = SendQQMessages()
res = sendq._sending(self.radio, self.lineEdit.text(), self.text.toPlainText())
if res:
self.text.setFocus() # 获取焦点
self.text.selectAll() # 全选
QMessageBox.warning(self, u'错误提示!', "发送成功", QMessageBox.Yes)
else:
QMessageBox.information(self, u'错误提示!', "发送失败", QMessageBox.Yes) # 清空剪贴板
sendq.EmptyClipboard() def validate(self):
'''
检测 input数据
'''
if (self.radiobtn1.isChecked() == False and self.radiobtn2.isChecked() == False):
QMessageBox.warning(self, u'错误提示!', "选择发送类型", QMessageBox.Yes)
return False
elif self.radiobtn1.isChecked():
self.radio = 1
elif self.radiobtn2.isChecked():
self.radio = 2 if self.lineEdit.text() == '':
QMessageBox.warning(self, u'错误提示!', "填写QQ昵称", QMessageBox.Yes)
return False if self.text.toPlainText() == '':
QMessageBox.warning(self, u'错误提示!', "填写发送内容", QMessageBox.Yes)
return False return True class SendQQMessages(object):
def _sending(self, stype, nickname, msg):
'''
发送QQ消息
:param type: 发送类型
:param nickname: QQ昵称
:param msg: messages
:return: bool
'''
if stype == 1:
return self.multi_S(nickname, msg) elif stype == 2:
return self.simple_S(nickname, msg) def multi_S(self, nickname, msg):
'''搜索QQ发送消息'''
qqObjstring = win32gui.FindWindow(None, "QQ") # qq 窗体句柄
# 打开QQ好友nickname窗体
self.setTexts(nickname)
win32gui.SendMessage(qqObjstring, 770)
win32gui.SendMessage(qqObjstring, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
win32gui.SendMessage(qqObjstring, win32con.WM_KEYUP, win32con.VK_RETURN, 0)
# 获取QQ好友窗口句柄
time.sleep(0.1) # sleep0.1秒,让给QQ弹出聊天窗口的时间
win = win32gui.FindWindow(None, nickname)
self.setTexts(msg) # 设置msg
T = win32gui.SendMessage(win, 770)
E = win32gui.SendMessage(win, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
win32gui.SendMessage(win, win32con.WM_KEYUP, win32con.VK_RETURN, 0)
if win and T == 0 and E == 0:
return True
else:
return False def simple_S(self, nickname, msg):
"""
直接发送qq消息
nickname:qq消息接收人
msg:需要发送的消息
"""
# 将消息写到剪贴板
self.setTexts(msg)
# 获取qq窗口句柄
win = win32gui.FindWindow(None, nickname)
# 剪贴板消息到QQ窗体 # SendMessage消息的常量值,770 剪贴板值 http://blog.csdn.net/exiaoyin/article/details/51881481
T = win32gui.SendMessage(win, 770)
# 模拟按下回车键
E = win32gui.SendMessage(win, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
win32gui.SendMessage(win, win32con.WM_KEYUP, win32con.VK_RETURN, 0)
if win and T == 0 and E == 0:
return True
else:
return False def setTexts(self, aString):
"""设置剪贴板"""
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardData(win32con.CF_UNICODETEXT, aString)
win32clipboard.CloseClipboard() def EmptyClipboard(self):
''' 清空剪切板'''
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard() if __name__ == "__main__":
app = QApplication(sys.argv)
main_widget = MainWidgetUI()
main_widget.show()
sys.exit(app.exec_())
截图:


pyqt win32发送QQ消息的更多相关文章
- iOS-打电话、发短信、发邮件【指定QQ用户发送QQ消息】
1.发短信 头文件 #import <MessageUI/MessageUI.h> 头部代理 @interface ViewController ()<MFMessageCompos ...
- python实现定时发送qq消息
因为生活中老是忘记各种事情,刚好又在学python,便突发奇想通过python实现提醒任务的功能(尽管TIM有定时功能),也可定时给好友.群.讨论组发送qq消息.其工作流程是:访问数据库提取最近计划— ...
- Python发送QQ消息
一.需求背景 每天早上取一批数据,数据文件经过压缩加密之后用邮箱发送,而解压密码通过QQ发送给运营.使用Python进行取数.文件加密在已经实现的情况下,需要实现通过QQ发送密码的功能. 在进 ...
- QQ消息无限发送!源代码
昨天我一个朋友发给我一个特别有趣的程序 可以无限发送QQ消息,非常有趣! 发送给朋友之后只要打开,便可自动发送消息. 点打开后 便可一直发送消息 用Edit plus 打开后 其源代码如下 是用VB ...
- zabbix学习系列之QQ消息报警
安装依赖包 环境 Zabbix: 3.2 OS:Centos 安装依赖包 yum install lrzsz chrony gcc gcc-c++ git openssl-devel perl-Ext ...
- PyQt学习遇到的问题:重写notify发送的消息为什么首先给了一个QWindow对象?
在PyQt开发图形界面应用时,从QApplication派生的子类重写notify方法后(具体请参考<PyQt学习随笔:通过自定义类重写QApplication的notify方法捕获应用的所有消 ...
- 编写Java程序,使用 Socket类模拟用户加入 QQ 群时,QQ 小冰发送欢迎消息的场景(用户充当客户端,QQ 小冰充当服务端)
查看本章节 查看作业目录 需求说明: 小冰是微软公司研发的人工智能机器人,被腾讯公司加入 QQ 群后,立即受到千万网友的喜爱.现在使用 Socket类模拟用户加入 QQ 群时,QQ 小冰发送欢迎消息的 ...
- 论如何用python发qq消息轰炸虐狗好友
因为我的某个好友在情人节的时候秀恩爱,所以我灵光一闪制作了qq消息轰炸并记录了下来. PS:另外很多人在学习Python的过程中,往往因为遇问题解决不了或者没好的教程从而导致自己放弃,为此我整理啦从基 ...
- ZeroMQ接口函数之 :zmq_msg_send – 从一个socket发送一个消息帧
ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_msg_send zmq_msg_send(3) ØMQ Manual - ØMQ/3.2.5 Name zmq_ ...
随机推荐
- python三大器(装饰器/生成器/迭代器)
1装饰器 1.1基本结构 def 外层函数(参数): def 内层函数(*args,**kwargs); return 参数(*args,**kwargs) return 内层函数 @外层函数 def ...
- GWAS后续分析:多基因风险评分(Polygenic Risk Score)的计算
一.什么是多基因风险评分 传统的GWAS研究只计算单个SNP位点与表型之间的关联性,再用Bonferroni校正,通过给定的阈值,筛选出显著的SNP位点. 这样会存在两个问题,第一.Bonferron ...
- 20175221 《Java程序设计》迭代和JDB(课下作业,选做):
20175221 <Java程序设计> 迭代和JDB(课下作业,选做): 任务详情 1 使用C(n,m)=C(n-1,m-1)+C(n-1,m)公式进行递归编程实现求组合数C(m,n)的功 ...
- mysql You can't specify target table 'xxx' for update in FROM clause的解决
DELETE from sp_goodscontent where goodsId in (SELECT t.goodsId from ( SELECT goodsId FROM sp_goodsco ...
- 基于jeesite的cms系统(二):整体设计
一.菜单设计 在系统管理-菜单管理中可以设置内容管理菜单(自动生成) 注意:归属模块应属于核心模块core.如果新加的的菜单设置为内容管理模块cms,系统下次重启时会重置本次设置,具体原因不详. 二. ...
- Windows API 调用示例
Ø 简介 本文主要记录 Windows API 的调用示例,因为这项技术并不常用,属于 C# 中比较孤僻或接触底层的技术,并不常用.但是有时候也可以借助他完成一些 C# 本身不能完成的功能,例如:通 ...
- PMP知识点(五)——配置管理
配置控制重点关注可交付成果及各个过程的技术规范,而变更控制则着眼于识别.记录.批准或否决对项目文件,可交付成果或基准的变更. 包括在实施整体变更控制过程中的部分配置管理活动有: 1.配置识别. 识别与 ...
- ARIMA模型原理
一.时间序列分析 北京每年每个月旅客的人数,上海飞往北京每年的游客人数等类似这种顾客数.访问量.股价等都是时间序列数据.这些数据会随着时间变化而变化.时间序列数据的特点是数据会随时间的变化而变化. 随 ...
- QMQTT简单介绍(1)
1 准备工具: wireshark安装包:网络抓包工具qmqtt源码:mqtt客户端源码(Qt版本)官网:http://mqtt.org/英文版协议说明文档:http://docs.oasis-ope ...
- solr7.5--win10--部署使用
2018年8月份学习使用solr,当时下载的版本是solr7.5,写这篇博文的时候是2019年3月份,solr此时已经出到了8.0版本.一个大版本的变迁肯定有很多的改动,暂时还未研究就不赘述了. 此篇 ...