完整代码
import tkinter
import win32con
import win32gui
# 都用函数吧
def FindWindow(chatroom):
win = win32gui.FindWindow(None, chatroom)
return win
def get_child_windows(parent):
'''
获得parent的所有子窗口句柄
返回子窗口句柄列表
'''
if not parent:
return
hwndChildList = []
win32gui.EnumChildWindows(parent, lambda hwnd, param: param.append(hwnd), hwndChildList)
# lambda匿名函数双参数的应用
return hwndChildList
win = FindWindow('xxx') # 可根据指定的聊天器窗口名来选择(可更改)
list_child = get_child_windows(win)
# print(list_child,len(list_child))
dict_Edit = {}
for i in list_child:
clsname = win32gui.GetClassName(i)
if clsname == 'Edit':
dict_Edit['Edit'] =i
# 分装一次调用发送的接口
# 默认发送的消息
# 如何默认指定信息,输入信息之后就更改,加个字段,加个判断
# a = 'xxx'
def send_message(i,message='大家好好打\n\t我是个新手不太会'): # 一个clsname,一个句柄
if len(entry.get()) != 0: # entry.get()对于函数调用来说是前面
message = entry.get()
try:
win32gui.SendMessage(i, win32con.WM_SETTEXT, None, message) # SendMessagen无法发送笑脸等符号
win32gui.PostMessage(i, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
win32gui.PostMessage(i, win32con.WM_KEYUP, win32con.VK_RETURN, 0)
print('发送消息成功')
except Exception as e:
print('报错异常是:{}'.format(e))
# 循环发函数
def loop(toggle=False): # 只可以一个参数么
global tracking_var
if toggle:
if tracking_var:
tracking_var = False
else:
tracking_var = True
if tracking_var:
send_message(dict_Edit['Edit'])
win.after(1000, loop)
# 创建按钮
win = tkinter.Tk()
win.title('闲话少说')
win.attributes('-topmost', True)
entry = tkinter.Entry(win)
entry.pack(side='left')
print('这个是空么:'+entry.get(),len(entry.get()),type(entry.get())) # 好像之后循环就没有跳转上来了
button1=tkinter.Button(win,text='单发',command=lambda :send_message(dict_Edit['Edit']))
button1.pack(side='left')
tracking_var = False
button3=tkinter.Button(win,text='循环发',command=lambda:loop(toggle=True))
button3.pack(side='left')
button2=tkinter.Button(win,text="退出",command=win.quit )#退出
button2.pack(side='left')
win.mainloop()
参考文章
python和pywin32实现窗口查找、遍历和点击
如何将Tkinter窗口置于其他窗口的前面
python设置窗口位置_python中tkinter窗口位置
python TKinter.Entry获取文本框内容
Python win32gui Module