keyboard.write那样的输入,怎么用win32实现指定窗口后台输入,前者是前台,只能在鼠标点击处输入,而我要在win32后台点击后进行输入,要输入的位置是游戏账号密码如下图:
还有后台拖动,就是从一个位置拖到另一个位置,不是拖动窗口,就像拖动验证图那样,发送一个拖动的消息给指定窗口,而不是鼠标移动过去,多个窗口一起拖动也没问题,因为要写一个后台脚本,找了好久也没找到
import win32gui
import win32con
import win32api
# 获取指定窗口的句柄
hwnd = win32gui.FindWindow(None, "窗口标题")
# 创建一个虚拟键盘按键
VK_CODE = win32con.VK_RETURN
key_down = win32gui.KeyBDInput(VK_CODE, 0x0008)
key_up = win32gui.KeyBDInput(VK_CODE, 0x0008 | 0x0020)
# 在消息循环中模拟键盘输入
def send_key_event():
win32api.PostMessage(hwnd, win32con.WM_KEYDOWN, *key_down)
win32api.PostMessage(hwnd, win32con.WM_KEYUP, *key_up)
# 定时发送键盘事件,实现后台输入和拖动
while True:
send_key_event()
win32api.Sleep(100)
可以借鉴下
import win32gui
import win32con
import win32api
win = win32gui.FindWindow(None, "cs123.txt - 记事本")
# 获取子窗体(记事本内部的编辑区域)
edit = win32gui.FindWindowEx(win,None,'Edit',None)
# 输入文本
win32gui.SendMessage(edit, win32con.WM_SETTEXT, None, 'Hello World!')
# 回车 win32con.WM_KEYDOWN按键-----VK_XXX这里是return所以是回车键
win32gui.PostMessage(edit,win32con.WM_KEYDOWN,win32con.VK_RETURN,0)
# 设置指定窗口的显示状态。
win32gui.ShowWindow(win, win32con.SW_SHOW)
# 设置为最前窗口
win32gui.SetForegroundWindow(win)
# 设置鼠标位置
win32api.SetCursorPos((5, 1050))
# 左单键击
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
# 关闭窗口
# win32gui.PostMessage(win32gui.FindWindow('Notepad', None), win32con.WM_CLOSE, 0, 0)
print(win)
print(edit)
我记得后台输入或者后台鼠标实现输入或者点击都是需要焦点的,获取焦点的方法如下:
win32api.SendMessage(hwnd, win32con.WM_SETFOCUS, 0, 0)
所以如果要多个窗体之间进行输入操作,完全同步是不可能的,必须是先获取到焦点,实现自动输入,然后切换到另一个窗体,切换焦点后再进行输入,输入调用方法postmessage接口:
win32api.PostMessage(hwnd, win32con.WM_CHAR, item, 0)
模拟键盘输入示例代码
import win32gui
import win32api
import win32con
def input_text(hwnd, text):
win32gui.SetForegroundWindow(hwnd)
for c in text:
if c.isupper():
win32api.keybd_event(win32con.VK_SHIFT, 0, win32con.KEYEVENTF_EXTENDEDKEY | 0, 0)
win32api.keybd_event(ord(c), 0, win32con.KEYEVENTF_EXTENDEDKEY | 0, 0)
win32api.keybd_event(ord(c), 0, win32con.KEYEVENTF_EXTENDEDKEY | win32con.KEYEVENTF_KEYUP, 0)
win32api.keybd_event(win32con.VK_SHIFT, 0, win32con.KEYEVENTF_EXTENDEDKEY | win32con.KEYEVENTF_KEYUP, 0)
elif c.islower():
win32api.keybd_event(ord(c.upper()), 0, win32con.KEYEVENTF_EXTENDEDKEY | 0, 0)
win32api.keybd_event(ord(c.upper()), 0, win32con.KEYEVENTF_EXTENDEDKEY | win32con.KEYEVENTF_KEYUP, 0)
else:
win32api.keybd_event(ord(c), 0, win32con.KEYEVENTF_EXTENDEDKEY | 0, 0)
win32api.keybd_event(ord(c), 0, win32con.KEYEVENTF_EXTENDEDKEY | win32con.KEYEVENTF_KEYUP, 0)
hwnd = win32gui.FindWindow(None, '游戏窗口标题')
input_text(hwnd, 'username')
input_text(hwnd, '{TAB}') # 切换到密码输入框
input_text(hwnd, 'password')
后台拖动示例代码
import time
import win32gui
import win32api
import win32con
def drag(hwnd, src_x, src_y, dst_x, dst_y):
win32gui.SetForegroundWindow(hwnd)
win32api.SetCursorPos((src_x, src_y))
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, src_x, src_y, 0, 0)
time.sleep(0.5)
inc_x = int((dst_x - src_x) / 10)
inc_y = int((dst_y - src_y) / 10)
for i in range(10):
cur_x, cur_y = win32api.GetCursorPos()
win32api.SetCursorPos((cur_x + inc_x, cur_y + inc_y))
time.sleep(0.1)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, dst_x, dst_y, 0, 0)
hwnd1 = win32gui.FindWindow(None, '窗口1标题')
hwnd2 = win32gui.FindWindow(None, '窗口2标题')
# 同时拖拽两个窗口的图标
drag(hwnd1, 400, 200, 600, 400)
drag(hwnd2, 900, 300, 700, 500)