Based on tkinter+win32+pynput to realize python's QQ WeChat refresh screen (slightly more advanced than some articles)

The principle is the same as most, use the clipboard to copy and paste to send messages

Show results:

 

When a session window is opened , use the function of win32 to display all identifiable windows, just select one.

There is no need to manually open the chat box again, which is more humane (to not open the chat box at all means that I must at least be able to read the qq list and control the running of qq in the background, which seems a bit difficult)

 

 After the object is selected, such a window appears, which can be used repeatedly

Including three buttons, select txt file to send not exactly the same but regular refresh

code show as below:

(Novices share, do not spray)

# 获取窗口
import win32gui
import win32con
import tkinter as tk
import ttkbootstrap
from pynput.keyboard import Key, Controller
from tkinter import filedialog

ffont = "华文琥珀"            # 字体
copy_times, copy_content, copy_suit, copy_count, copy_ed_times, f_content = None, None, None, None, None, None


def get_hwnd_dic(hwnd, hwnd_title):
    if (win32gui.IsWindow(hwnd)
            and win32gui.IsWindowEnabled(hwnd)
            and win32gui.IsWindowVisible(hwnd)
            and win32gui.GetWindowText(hwnd)):
        hwnd_title[f"{hwnd}"] = win32gui.GetWindowText(hwnd)


def get_hwnd():
    hwnd_title = {}
    win32gui.EnumWindows(get_hwnd_dic, hwnd_title)
    return hwnd_title


hwndJson = get_hwnd()                          # 引用上面两个函数,获取当前窗口
numbers = list(hwndJson.keys())                # 所有窗口的句柄
titles = list(hwndJson.values())               # 所有窗口名称
lens = len(titles)

window_of_set = tk.Tk()
window_of_set.geometry('420x{}+10+10'.format(100+lens*30))
window_of_set.resizable(False, False)
window_of_set.title("cqu.rol")
try:
    window_of_set.iconbitmap("resources/001.ico")         # 个人习惯,更改图标,无则跳过
except:
    pass

tagsp = ttkbootstrap.Label(window_of_set, text="选择一个人进行刷屏", font=(ffont, 15))
tagsp.pack(pady=5)
variable_value = tk.StringVar()

for w in range(lens):
    bbb = ttkbootstrap.Radiobutton(window_of_set, text=titles[w], variable=variable_value, value=numbers[w])
    bbb.place(x=70, y=25 * w + 40)
kb = Controller()                                   # 单选按钮


def nexta():                                        # 当点击按钮以后:
    window_of_sp = tk.Toplevel(window_of_set)
    window_of_sp.geometry('330x180+10+10')
    window_of_sp.resizable(False, False)
    window_of_sp.title(" ")
    window_of_sp.attributes("-topmost", 1)
    ttkbootstrap.Label(window_of_sp, text="输入重复次数及内容", font=(ffont, 15)).pack(pady=10)
    try:
        window_of_set.iconbitmap("resources/001.ico")
    except:
        pass
    choose_number = variable_value.get()             # 获取选的是哪一个窗口(的句柄)
    e1 = tk.Entry(window_of_sp, width=40, font=(ffont, 10))
    e1.pack()                                        # 输入框1,获取重复次数
    e2 = tk.Entry(window_of_sp, width=40, font=(ffont, 10))
    e2.pack(pady=10)                                  # 输入框2,获取内容

    variable_val = tk.StringVar()
    e3 = ttkbootstrap.Checkbutton(window_of_sp, text="重复次数显示", variable=variable_val, onvalue="OK", offvalue="NOT")
    e3.pack()                                         # 单选框,获取是的显示已经重复的次数

    # 开始刷屏
    def start_copy():
        global copy_times, copy_content, copy_suit, copy_count, copy_ed_times, f_content
        copy_ed_times += 1
        final_s = "Error"
        if copy_count == "OK":
            final_s = "第{}次:{}".format(copy_ed_times, copy_content)
        elif copy_count == "NOT":
            final_s = str(copy_content)                  # 这两句获取【重复次数】按钮的结果,并将重复内容写上去,即获得最后说的话

        if copy_ed_times == copy_times:
            window_of_sp.after_cancel(copy_suit)
            copy_times, copy_content, copy_suit, copy_count, copy_ed_times, f_content = None, None, None, None, None, None
            # 当计数达到次数时停止循环,所有全局变量归零
        else:
            kb.type(final_s)
            kb.press(Key.enter)    # 这里按下回车键,如果qq是回车加enter发送消息,随之替换即可
            copy_suit = window_of_sp.after(200, start_copy)
            # 否则循环,每200毫秒重复一次(网络延迟,不要太快)

    # 点击开始
    def start_fun():
        global copy_times, copy_content, copy_suit, copy_count, copy_ed_times, f_content
        copy_times = int(e1.get()) + 1
        copy_content = e2.get()
        copy_ed_times = 0          # 已经重复次数归零
        if variable_val.get():
            copy_count = variable_val.get()
        else:
            copy_count = "NOT"
            # 【重复次数】按钮调整
        win32gui.ShowWindow(choose_number, win32con.SW_SHOWNORMAL)
        win32gui.SetWindowPos(choose_number, win32con.HWND_TOPMOST, 0, 0, 0, 0,
                              win32con.SWP_NOOWNERZORDER | win32con.SWP_NOSIZE | win32con.SWP_NOMOVE)
        # 将对话窗口置顶
        start_copy()  # 运行

    # 停止刷屏
    def stop_copy():
        global copy_times, copy_content, copy_suit, copy_count, copy_ed_times
        copy_times, copy_content, copy_suit, copy_count, copy_ed_times, f_content = None, None, None, None, None, None
        window_of_sp.destroy()

    # 点击文本
    def start_txtt():
        global copy_times, copy_content, copy_suit, copy_count, copy_ed_times, f_content
        copy_ed_times += 1
        if copy_ed_times == copy_times:
            window_of_sp.after_cancel(copy_suit)
            copy_times, copy_content, copy_suit, copy_count, copy_ed_times, f_content = None, None, None, None, None, None
        else:
            xxw = copy_ed_times-1
            kb.type(f_content[xxw])
            kb.press(Key.enter)
            copy_suit = window_of_sp.after(200, start_txtt)

    def start_txt():
        global copy_times, copy_content, copy_suit, copy_count, copy_ed_times, f_content
        for_path = filedialog.askopenfilename(title="待处理 请选择", filetypes=[("", ".txt")], defaultextension=[("", ".txt")])
        f_content = open(for_path, "r", encoding="utf-8").readlines()
        win32gui.ShowWindow(choose_number, win32con.SW_SHOWNORMAL)
        win32gui.SetWindowPos(choose_number, win32con.HWND_TOPMOST, 0, 0, 0, 0,
                              win32con.SWP_NOOWNERZORDER | win32con.SWP_NOSIZE | win32con.SWP_NOMOVE)
        copy_times = len(f_content) +1
        copy_ed_times = 0
        start_txtt()

    buop1 = tk.Button(window_of_sp, text="点击开始", command=start_fun, font=(ffont, 10))
    buop1.place(x=40, y=140)
    buop2 = tk.Button(window_of_sp, text="选取文档", command=start_txt, font=(ffont, 10))
    buop2.place(x=240, y=140)
    buop4 = tk.Button(window_of_sp, text="点击退出", command=stop_copy, font=(ffont, 10))
    buop4.place(x=140, y=140)
    

buop3 = tk.Button(window_of_set, text="点击进入刷屏", command=nexta, font=(ffont, 15))
buop3.place(x=150, y=lens * 30)

window_of_set.mainloop()

Guess you like

Origin blog.csdn.net/m0_52285505/article/details/126936324