pywin32后台输入及拖动

keyboard.write那样的输入,怎么用win32实现指定窗口后台输入,前者是前台,只能在鼠标点击处输入,而我要在win32后台点击后进行输入,要输入的位置是游戏账号密码如下图:

img


在指定窗口及输入框输入,并且可以同时多个窗口输入,相互之间光标没有影响

还有后台拖动,就是从一个位置拖到另一个位置,不是拖动窗口,就像拖动验证图那样,发送一个拖动的消息给指定窗口,而不是鼠标移动过去,多个窗口一起拖动也没问题,因为要写一个后台脚本,找了好久也没找到


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)