pyqt win32發送QQ消息

標題應該改成:python+win32發送QQ消息,全程使用python套個pyqt殼。前端

其實代碼來自: http://blog.csdn.net/suzyu12345/article/details/52934328python

 

只是說明幾個問題windows

1.在64位windows系統中不可用app

雖然可獲取窗體句柄,但沒法使用SendMessage 發送消息佈局

2.QQ必須處於Windows的活動狀態ui

QQ必須處於桌面的活動狀態spa

3.發送的消息必須臨時保存在剪貼板.net

經過剪貼板在發送出去 code

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

 

 

截圖:orm

 

相關文章
相關標籤/搜索