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_())

 

 

截图:

 

转载于:https://www.cnblogs.com/dcb3688/p/4608047.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
后台采用apache服务器下的cgi处理c语言做微信小程序后台逻辑的脚本映射。PC端的服务器和客户端都是基于c语言写的。采用mysql数据库进行用户数据和聊天记录的存储。.zip C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值