原理和大多数一样,利用剪切板复制粘贴发送消息
效果展示:
当打开了某个会话窗口,这里利用win32的功能,将所有可识别的窗口展示出来,单选即可。
不需要再次手动打开聊天框,更加人性化(想要完全不打开聊天框意味着我起码要能够读取到qq列表,控制qq后台运行,那难度似乎有些高)
选定对象后出现这样的窗口,可以反复利用
包括有三个按钮,选取txt文档以发送不完全相同但有规律的刷屏
代码如下:
(新手分享,勿喷)
# 获取窗口
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()