標題應該改成: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