zoukankan      html  css  js  c++  java
  • 编写qq刷屏软件

    使用pywin32制作qq刷屏软件

    思路:

    1. 使用pywin32,来访问windows系统的剪贴板,把要发送的内容加入剪贴板中
    2. 使用pywin32,模仿按键操作“control+v”把内容复制到QQ的聊天窗口上,然后“enter”发送消息。
    3. 文件读取,把要刷屏的语言保存在本地的shuaping.txt中,一次性读取到列表中。然后一条一条的发送完成刷屏。
      参考:
      如何用python模拟键盘输入
      python访问剪贴板

    代码:

    1. python操作剪贴板:如何把文件内容复制进入剪贴板
     #-*- coding: utf-8 -*-
    import win32clipboard as cb
    import win32con
    date = "Hello,World"
    cb.OpenClipboard()#打开剪贴板
    cb.SetClipboardData(win32con.CF_TEXT, date)#把数剧复制到剪贴板
    cb.CloseClipboard()#用完后关闭剪贴板
    

    试一试粘贴,看内容是否变成了“Hello World”

    1. 模仿按键操作“control+v”和“enter”
    import win32clipboard as cb
    import win32con
    import win32api
    date = "Hello,World"
    cb.OpenClipboard()#打开剪贴板
    cb.SetClipboardData(win32con.CF_TEXT, date)#把数剧复制到剪贴板
    cb.CloseClipboard()#用完后关闭剪贴板
    win32api.keybd_event(17,0,0,0)  #ctrl键位码是17
    win32api.keybd_event(86,0,0,0)  #v键位码是86
    win32api.keybd_event(86,0,win32con.KEYEVENTF_KEYUP,0) #释放按键
    win32api.keybd_event(17,0,win32con.KEYEVENTF_KEYUP,0)
    

    这里发现了一些问题,如果有数据中包含中文字符,粘贴出来是乱码,搜索后发现复制是默认使用的是ANCI,那么解决方法是指定使用unicode格式
    cb.SetClipboardData(win32con.CF_UNICODETEXT, date)就是把这个函数的第一个参数改为CF_UNICODETEXT

    1. 读取文件
    def open_file(filename):
        f = open(filename, "r")
        content = f.readlines() #考虑到这个文件内容一般不会很大,就一次性读取到列表了。
        f.close()
        return content
    
    1. 使用wxpython 编写图像界面:
    import wx
    class Screen(wx.Frame):
        def __init__(self):
            self.explain = u'       使用说明'
            wx.Frame.__init__(self, parent=None, id=1, title=u"QQ刷屏器", size=(600,400))
            self.panel = wx.Panel(self, -1)
            self.Centre() #居中显示窗口
            self.dateText = wx.TextCtrl(self.panel, -1, self.explain, style=wx.TE_MULTILINE, size=(300,330), pos=(1, 10))
            version = wx.StaticText(self.panel, -1, u"版本1.0
    作者:即刻", pos=(520,320))
            self.open_file = wx.Button(self.panel, label=u'打开刷屏文件            ', pos=(310,40))
            self.start = wx.Button(self.panel, label=u'开始刷屏', pos=(450,40))
            self.SleepTxet = wx.StaticText(self.panel, -1, u"刷屏的时间间隔(s):", pos=(310,10))
            self.Sleep = wx.TextCtrl(self.panel, -1, "0.5", pos=(450,10))
            self.SaveDate = wx.Button(self.panel, -1, u"保存对刷屏文件的修改", pos=(310,70))
            self.stop = wx.Button(self.panel, -1,label=u"停止刷屏", pos=(450,70))
    if __name__ == "__main__":
        app = wx.App()
        screen = Screen()
        screen.Show()
        app.MainLoop()
    

    参考wxpython入门

    1. 完整代码(整体功能已完成,基本可以使用,但缺陷太坑,根本停不下来!QaQ)
    # -*- coding: utf-8 -*-
    import win32clipboard as cb
    import win32con
    import win32api
    import time
    import os
    import wx
    class Screen(wx.Frame):
        def __init__(self):
            self.interval = 2  #默认刷屏的间隔时间
            self.condition = False  #刷屏的状态,默认关闭
            self.explain = u'                使用说明
    1.你可以在本框内自定义刷屏文本,或者打开刷屏的txt文件
    2.点击开始后 3s开始刷屏,请立即点击qq聊天窗口
    3.停止按钮无效,暂时没有解决方法 QaQ '
            wx.Frame.__init__(self, parent=None, id=1, title=u"QQ刷屏器", size=(600,400))
            self.panel = wx.Panel(self, -1)
            self.Centre() #居中显示窗口
            self.dateText = wx.TextCtrl(self.panel, -1, self.explain, style=wx.TE_MULTILINE, size=(300,330), pos=(1, 10))
            wx.StaticText(self.panel, -1, u"版本1.0
    作者:即刻", pos=(520,320))
            open_file = wx.Button(self.panel, label=u'打开刷屏文件            ', pos=(310,40))
            start = wx.Button(self.panel, label=u'开始刷屏', pos=(450,40))
            wx.StaticText(self.panel, -1, u"刷屏的时间间隔(s):", pos=(310,10))
            self.Sleep = wx.TextCtrl(self.panel, -1, str(self.interval), pos=(450,10))
            SaveDate = wx.Button(self.panel, -1, u"保存对刷屏文件的修改", pos=(310,70))
            stop = wx.Button(self.panel, -1,label=u"停止刷屏", pos=(450,70))
            self.Bind(wx.EVT_BUTTON, self.open_file, open_file)
            self.Bind(wx.EVT_BUTTON, self.start, start)
            self.Bind(wx.EVT_BUTTON, self.stop, stop)
            self.Bind(wx.EVT_BUTTON, self.SaveDate, SaveDate)
        def stop(self,event):
            self.condition = False
        def open_file(self, event):
            """open a file"""
            self.dirname = ''
            dlg = wx.FileDialog(self, "Choose a file", self.dirname, "", "*.*", wx.OPEN)  # 调用一个函数打开对话框
            if dlg.ShowModal() == wx.ID_OK:
                self.filename = dlg.GetFilename()
                self.dirname = dlg.GetDirectory()
                self.address = os.path.join(self.dirname, self.filename)
                f = open(self.address, "r")
                file = (f.read()).decode(encoding='utf-8')  # 解码,使文件可以读取中文
                f.close()
                self.dateText.Clear()
                self.dateText.AppendText(file)  # 把打开的文件内容显示在多行文本框内
            dlg.Destroy()
        def SaveDate(self, event):
            date = (self.dateText.GetValue()).encode(encoding="utf-8")  # 编码,使中文可以正确存储
            f = open(self.address, 'w')
            f.write(date)
            f.close()  # 把文本框内的数据写入并关闭文件
            dlg = wx.MessageDialog(self, u"文件已经成功保存", u"消息提示", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
        def start(self,event):
            self.interval = float(self.Sleep.GetValue())  #因为sleep函数的参数必须为小数,而GetValue()如果数字不带小数点会得到整数。
            file = (self.dateText.GetValue())
            date = file.split("
    ")
            time.sleep(3)
            self.condition =True
            while self.condition:
                for dateline in date:
                    time.sleep(self.interval)
                    cb.OpenClipboard()  # 打开剪贴板
                    cb.SetClipboardData(win32con.CF_UNICODETEXT, dateline)  # 把数剧复制到剪贴板
                    cb.CloseClipboard()  # 用完后关闭剪贴板
                    win32api.keybd_event(17, 0, 0, 0)  # ctrl键位码是17
                    win32api.keybd_event(86, 0, 0, 0)  # v键位码是86
                    win32api.keybd_event(86, 0, win32con.KEYEVENTF_KEYUP, 0)  # 释放按键
                    win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)
                    win32api.keybd_event(13, 0, 0, 0)  # 回车键码是13
                    win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0)  # 释放回车键
    if __name__ == "__main__":
        app = wx.App()
        screen = Screen()
        screen.Show()
        app.MainLoop()
    

    ps在这几天查找到了直接给窗口发送消息的办法,即取得窗口的句柄,利用win32api直接发送消息给窗口,这样省却很多中间环节,不过需要了解的知识很多,暂时无精力看它了。

    参考:
    pyQT指定窗口截图
    利用python和win32定制一个按键精灵

    1. 如何获得窗口的句柄:使用spy++或者使用win32的FindWindow和FindWindEx函数
    import win32gui
    label = u"风的 Android手机"  #这里是窗口的名字
    hld = win32gui.FindWindow(None,label)
    print "%x" % hld  #注意此处应该以十六进制输入,因为python默认十进制输出。
    

    获取窗口的句柄:70622 这和我用spy++获取到的一样。

    这里再次遇到问题:qq的聊天窗口 查找不到子窗口,于是也没有查找到Edit控件,于是无法把内容传递到输入框内
    ·搜查资料后得知qq使用的是DirectUI控件和父窗口在一起,无法抓取到控件。

    待续。。。

    可以完善的地方:

    1. 使用wxpython来完善使用界面,然后方便的使用cx_freeze或py2exe打包为exe分享给朋友使用
    2. 使用wxpython的多行文本框来显示刷屏的语句,并且可以修改,并保存这些语句。
    3. 可以自己设置发送的间隔时间,设置一次性发送语句的条数。
    4. 检测刷屏语句的字数,如果字数超过qq聊天窗口的限制,把一条语句拆分发送。
    5. 加入图片刷屏的功能。

    这是我想到的最简单实现qq聊天刷屏的方法,但缺点很明显,消息刷屏的时候就不能做其他操作了。

    问题:
    1.是否有其他不用模拟按键的方法来发送qq消息。

    如果有建议希望您可以详细告诉我,不胜感激。如果有问题,请评论,我会尽心解答。

  • 相关阅读:
    技术学习沙龙
    mysql升级5.5
    mysql用户权限管理的问题
    dwz(jui)刷新当前dialog的方法
    perl进程管理一例
    cron执行service
    tp数据库表大写命名的一些问题
    php执行多个存储过程
    thinkphp使用中遇到的问题
    html5 ajax 文件上传
  • 原文地址:https://www.cnblogs.com/jikeboy/p/5658569.html
Copyright © 2011-2022 走看看