win32库的基本使用
操作介绍
下载
要注意Python版本及位数,否则会安装失败
直接到上面的地址去找合适的版本下载安装,已包含其它的工具
下载的已经是可执行文件,直接执行即可
https://sourceforge.net/projects/pywin32/
获取句柄的方式
- VC或VS工具里面自带SPY++,可以获取句柄信息, 这个你没有,请看下条
- 没错,就是按键精灵(不是做广告哈,第一次查找句柄信息的时候就是用这货),功能简单易用
使用
查询句柄
# 根据类名及标题名查询句柄, hwnd = win32gui.FindWindow("Tfrm_YzzPlayer","叶子猪手游模拟器") # 查找指定句柄的子句柄,后两个参数为子类的类名与标题,如果没有或不确定,可以写None hwnd = win32gui.FindWindow(hwnd,None,"sub_class","sub_title")
修改窗口大小
# 没有直接修改窗口大小的方式,但可以曲线救国,几个参数分别表示句柄,起始点坐标,宽高度,是否重绘界面 ,如果想改变窗口大小,就必须指定起始点的坐标,没果对起始点坐标没有要求,随便写就可以;如果还想要放在原先的位置,就需要先获取之前的边框位置,再调用该方法即可 win32gui.MoveWindow(hwnd,20,20,405,756,True)
前台后台
# 指定句柄设置为前台,也就是激活 win32gui.SetForegroundWindow(hwnd) # 设置为后台 win32gui.SetBkMode(hwnd, win32con.TRANSPARENT)
按键
# 在这里两几种方式可以选择 可以使用win32gui包和win32api的包,目前未深入了解,感觉是一样的,每一个里面还有PostMessage与SendMessage两都可选,依据其他文档的说法是SendMessage是同步的,在成功执行后才会返回,而PostMessage是异步执行的,直接返回,只是把内容加在队列里 # 几个参数分别为: 操作的句柄 , 按键的类型(是按下或者是弹起), 键码(大部分的功能键在win32con包中都,对于常用的数字或字母,直接去查找ASII码即可,如A 65 等等),相对于句柄中的位置(在这里需要使用win32api.MAKELONG(x,y)将两个地址转换为一个长地址; # 在这种情况下,可以做到后台的操作 # 需要注意的是每一个按键要有按下与弹起两个过程,比果我们要按Enter键,就需要有两句代码,第二个参数分别为 KEYDOAWN与 KEYUP ,如果是组合键,就先把组合键分别按下后再分别弹起即可 # win32gui.PostMessage(tid, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0) # win32gui.SendMessage(tid, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0) win32api.SendMessage(hwd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, long_position) win32api.PostMessage(hwd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, long_position)
发送消息
在这里有两种方式,一种是找到输入框的句柄,将键类型设置为SETTEXT
另外一种方式为将需要输入的内容放到粘贴板中,直接粘贴即可
# 方式一为网络上说明,自己在测试的时候一直不成功,因为我是操作安卓模拟器里面的软件,查找不到输入框的句柄的原因 win32gui.SendMessage(tid, win32con.WM_SETTEXT,None,‘hello') # 方式二,测试通过 其实就是把内容放到剪贴板中,直接ctrl + v即可,感觉适用于找不到输入框的具体句柄,但焦点已经在输入框中的情况 # 定义两个方法,来读写剪贴板,注意要和目标系统的编码方式相同 def getText(): # 读取剪切板 w.OpenClipboard() d = w.GetClipboardData(win32con.CF_TEXT) w.CloseClipboard() return d def setText(aString): # 写入剪切板 w.OpenClipboard() w.EmptyClipboard() w.SetClipboardData(win32con.CF_TEXT, aString.encode(encoding='gbk')) w.CloseClipboard()
win32虽然也可控制键盘,但不如使用PyUserInput的方便。需要注意在windows和mac下接口参数可能有所不同。
from pymouse import PyMouse from pykeyboard import PyKeyboard m = PyMouse() k = PyKeyboard() x_dim, y_dim = m.screen_size() # 鼠标点击 m.click(x_dim/2, y_dim/2, 1) # 键盘输入 k.type_string('Hello, World!') # 按住一个键 k.press_key('H') # 松开一个键 k.release_key('H') # 按住并松开,tap一个键 k.tap_key('e') # tap支持重复的间歇点击键 k.tap_key('l',n=2,interval=5) # 发送判断文字 k.type_string('123456') #创建组合键 k.press_key(k.alt_key) k.tap_key(k.tab_key) k.release_key(k.alt_key) # 特殊功能键 k.tap_key(k.function_keys[5]) # Tap F5 k.tap_key(k.numpad_keys['Home']) # Tap 'Home' on the numpad k.tap_key(k.numpad_keys[5], n=3) # Tap 5 on the numpad, thrice # Mac系统 k.press_keys(['Command','shift','3']) # Windows系统 k.press_keys([k.windows_l_key,'d']) 其中的PyMouseEvent和PyKeyboardEvent还可用于监听鼠标和键盘事件的输入
案例
# _*_ coding:UTF-8 _*_ import win32api import win32con import win32gui from ctypes import * import time VK_CODE = { 'backspace': 0x08, 'tab': 0x09, 'clear': 0x0C, 'enter': 0x0D, 'shift': 0x10, 'ctrl': 0x11, 'alt': 0x12, 'pause': 0x13, 'caps_lock': 0x14, 'esc': 0x1B, 'spacebar': 0x20, 'page_up': 0x21, 'page_down': 0x22, 'end': 0x23, 'home': 0x24, 'left_arrow': 0x25, 'up_arrow': 0x26, 'right_arrow': 0x27, 'down_arrow': 0x28, 'select': 0x29, 'print': 0x2A, 'execute': 0x2B, 'print_screen': 0x2C, 'ins': 0x2D, 'del': 0x2E, 'help': 0x2F, '0': 0x30, '1': 0x31, '2': 0x32, '3': 0x33, '4': 0x34, '5': 0x35, '6': 0x36, '7': 0x37, '8': 0x38, '9': 0x39, 'a': 0x41, 'b': 0x42, 'c': 0x43, 'd': 0x44, 'e': 0x45, 'f': 0x46, 'g': 0x47, 'h': 0x48, 'i': 0x49, 'j': 0x4A, 'k': 0x4B, 'l': 0x4C, 'm': 0x4D, 'n': 0x4E, 'o': 0x4F, 'p': 0x50, 'q': 0x51, 'r': 0x52, 's': 0x53, 't': 0x54, 'u': 0x55, 'v': 0x56, 'w': 0x57, 'x': 0x58, 'y': 0x59, 'z': 0x5A, 'numpad_0': 0x60, 'numpad_1': 0x61, 'numpad_2': 0x62, 'numpad_3': 0x63, 'numpad_4': 0x64, 'numpad_5': 0x65, 'numpad_6': 0x66, 'numpad_7': 0x67, 'numpad_8': 0x68, 'numpad_9': 0x69, 'multiply_key': 0x6A, 'add_key': 0x6B, 'separator_key': 0x6C, 'subtract_key': 0x6D, 'decimal_key': 0x6E, 'divide_key': 0x6F, 'F1': 0x70, 'F2': 0x71, 'F3': 0x72, 'F4': 0x73, 'F5': 0x74, 'F6': 0x75, 'F7': 0x76, 'F8': 0x77, 'F9': 0x78, 'F10': 0x79, 'F11': 0x7A, 'F12': 0x7B, 'F13': 0x7C, 'F14': 0x7D, 'F15': 0x7E, 'F16': 0x7F, 'F17': 0x80, 'F18': 0x81, 'F19': 0x82, 'F20': 0x83, 'F21': 0x84, 'F22': 0x85, 'F23': 0x86, 'F24': 0x87, 'num_lock': 0x90, 'scroll_lock': 0x91, 'left_shift': 0xA0, 'right_shift ': 0xA1, 'left_control': 0xA2, 'right_control': 0xA3, 'left_menu': 0xA4, 'right_menu': 0xA5, 'browser_back': 0xA6, 'browser_forward': 0xA7, 'browser_refresh': 0xA8, 'browser_stop': 0xA9, 'browser_search': 0xAA, 'browser_favorites': 0xAB, 'browser_start_and_home': 0xAC, 'volume_mute': 0xAD, 'volume_Down': 0xAE, 'volume_up': 0xAF, 'next_track': 0xB0, 'previous_track': 0xB1, 'stop_media': 0xB2, 'play/pause_media': 0xB3, 'start_mail': 0xB4, 'select_media': 0xB5, 'start_application_1': 0xB6, 'start_application_2': 0xB7, 'attn_key': 0xF6, 'crsel_key': 0xF7, 'exsel_key': 0xF8, 'play_key': 0xFA, 'zoom_key': 0xFB, 'clear_key': 0xFE, '+': 0xBB, ',': 0xBC, '-': 0xBD, '.': 0xBE, '/': 0xBF, '`': 0xC0, ';': 0xBA, '[': 0xDB, '\\': 0xDC, ']': 0xDD, "'": 0xDE} class POINT(Structure): _fields_ = [("x", c_ulong), ("y", c_ulong)] #获取游标位置 def get_mouse_point(): po = POINT() windll.user32.GetCursorPos(byref(po)) return int(po.x), int(po.y) #实现鼠标单击功能 def mouse_click(x=None, y=None): if not x is None and not y is None: mouse_move(x, y) time.sleep(0.05) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) #实现鼠标双击功能 def mouse_dclick(x=None, y=None): if not x is None and not y is None: mouse_move(x, y) time.sleep(0.05) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) #实现游标移动 def mouse_move(x,y): windll.user32.SetCursorPos(x, y) def key_input(str1=''): for c in str1: print('c=',c) win32api.keybd_event(VK_CODE[c], 0, 0, 0) win32api.keybd_event(VK_CODE[c], 0, win32con.KEYEVENTF_KEYUP, 0) time.sleep(0.01) return True if __name__ == "__main__": x,y = get_mouse_point() print(x,y) mouse_click(388,118) str1 = 'hello------' key_input(str1) # x,y = get_mouse_point() # fff = str(x) + "+" + str(y) # print fff while (1): str1 = 'hello------' signal = key_input(str1) time.sleep(0.5) if signal: break
import win32gui import win32con import win32api from ctypes import * import time # import win32ui # w = win32ui.FindWindow("WeChatMainWndForPC", '微信') # print(w.GetDlgItemText()) #获取弹窗信息 # 从顶层窗口向下搜索主窗口,无法搜索子窗口 # FindWindow(lpClassName=None, lpWindowName=None) 窗口类名 窗口标题名 handle = win32gui.FindWindow("Notepad", None) #获取某个句柄的类名和标题 title = win32gui.GetWindowText(handle)#获取标题 clsname = win32gui.GetClassName(handle)#获取类名 # print(title) # print(clsname) # 打印句柄 # # 十进制 # print(handle) # # 十六进制 # print("%x" %(handle) ) # # 搜索子窗口 # # 枚举子窗口 # hwndChildList = [] # win32gui.EnumChildWindows(handle,lambda hwnd,param: param.append(hwnd),hwndChildList) # print(hwndChildList) # FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=None) 父窗口句柄 若不为0, # 则按照z-index的顺序从hwndChildAfter向后开始搜索子窗体,否则从第一个子窗体开始搜索。 子窗口类名 子窗口标题 subHandle = win32gui.FindWindowEx(handle, None, None, None) print(subHandle) # # 获得窗口的菜单句柄 # menuHandle = win32gui.GetMenu(subHandle) # print(menuHandle) # # 获得子菜单或下拉菜单句柄 # # 参数:菜单句柄 子菜单索引号 # subMenuHandle = win32gui.GetSubMenu(menuHandle, 0) # print(subMenuHandle) # # 获得菜单项中的的标志符,注意,分隔符是被编入索引的 # # 参数:子菜单句柄 项目索引号 # menuItemHandle = win32gui.GetMenuItemID(subMenuHandle, 0) # # 发送消息,加入消息队列,无返回 # # 参数:句柄 消息类型 WParam IParam # win32gui.PostMessage(subHandle, win32con.WM_COMMAND, menuItemHandle, 0) # # # wParam的定义是32位整型,high word就是他的31至16位,low word是它的15至0位。 # # 当参数超过两个,wParam和lParam不够用时,可以将wParam就给拆成两个int16来使用。 # # 这种时候在python里记得用把HIWORD的常数向左移16位,再加LOWORD,即wParam = HIWORD<<16+LOWORD。 # # # 下选框内容更改 # # 参数:下选框句柄; 消息内容; 参数下选框的哪一个item,以0起始的待选选项的索引;如果该值为-1,将从组合框列表中删除当前选项, # # 并使当前选项为空; 参数 # # CB_Handle为下选框句柄,PCB_handle下选框父窗口句柄 # if win32api.SendMessage(CB_handle, win32con.CB_SETCURSEL, 1, 0) == 1: # # 下选框的父窗口命令 # # 参数:父窗口句柄; 命令; 参数:WParam:高位表示类型,低位表示内容;参数IParam,下选框句柄 # # CBN_SELENDOK当用户选择了有效的列表项时发送,提示父窗体处理用户的选择。 LOWORD为组合框的ID. HIWORD为CBN_SELENDOK的值。 # win32api.SendMessage(PCB_handle, win32con.WM_COMMAND, 0x90000, CB_handle) # # CBN_SELCHANGE当用户更改了列表项的选择时发送,不论用户是通过鼠标选择或是通过方向键选择都会发送此通知。LOWORD为组合框的ID. HIWORD为CBN_SELCHANGE的值。 # win32api.SendMessage(PCB_handle, win32con.WM_COMMAND, 0x10000, CB_handle) # # # # 设置文本框内容,等窗口处理完毕后返回true。中文需编码成gbk # # 参数:句柄;消息类型;参数WParam,无需使用; 参数IParam,要设置的内容,字符串 # win32api.SendMessage(subHandle, win32con.WM_SETTEXT, 0, 'hello,你好') # 获取窗口位置,左上角,右下角 left, top, right, bottom = win32gui.GetWindowRect(handle) #获取鼠标的位置 # print(win32api.GetCursorPos()) # # 控件点击确定,处理消息后返回0 # # 参数:窗口句柄; 消息类型; 参数WParam HIWORD为0(未使用),LOWORD为控件的ID; 参数IParam 0(未使用),确定控件的句柄 # win32api.SendMessage(Mhandle, win32con.WM_COMMAND, 1, confirmBTN_handle) '''模拟滚轮滚动,下面这个方法可模拟鼠标中轴滑动,-1代表页面向下,1代表向上。网上说了可以指定任意数,亲测后发现程序只识别正数、负数,正数向上移动一个位置,负数向下移动一个位置,跟值大小没关系。就是时候-1和-100没区别,都只向下移动一个单位而已。前两个参数可以是0。''' win32api.mouse_event(win32con.MOUSEEVENTF_WHEEL,0,0,-100) #设置睡眠时间确保系统收到信号做出响应 time.sleep(0.2) # # 获取窗口文本不含截尾空字符的长度 # # # 参数:窗口句柄; 消息类型; 参数WParam; 参数IParam # bufSize = win32api.SendMessage(handle, win32con.WM_GETTEXTLENGTH, 0, 130) +1 # # # # # # 利用api生成Buffer # strBuf = win32gui.PyMakeBuffer(bufSize) # # print(strBuf) # # # # 发送消息获取文本内容 # # # 参数:窗口句柄; 消息类型;文本大小; 存储位置 # length = win32gui.SendMessage(subHandle, win32con.WM_GETTEXT, bufSize, strBuf) # # # # 反向内容,转为字符串 # text = str(strBuf[:-1]) # # print(text) # # address, length = win32gui.PyGetBufferAddressAndLen(strBuf) # text = win32gui.PyGetString(address, length) # print('text: ', text) # 读取剪切板 import win32clipboard as w # w.OpenClipboard() # d = w.GetClipboardData(win32con.CF_TEXT) # w.CloseClipboard() # print(d.decode('gbk')) # 写入剪切板 # w.OpenClipboard() # w.EmptyClipboard() # w.SetClipboardData(win32con.CF_TEXT, 'hello world'.encode(encoding='gbk')) # w.CloseClipboard() '''模拟鼠标及键盘''' # 获取窗口焦点 # win32gui.SetForegroundWindow(subHandle) # # 快捷键Alt+F # win32api.keybd_event(18, 0, 0, 0) # Alt # win32api.keybd_event(70, 0, 0, 0) # F # win32api.keybd_event(70, 0, win32con.KEYEVENTF_KEYUP, 0) # 释放按键 # win32api.keybd_event(18, 0, win32con.KEYEVENTF_KEYUP, 0) # # # 快捷键I # win32api.keybd_event(73, 0, 0, 0) # I # win32api.keybd_event(73, 0, win32con.KEYEVENTF_KEYUP, 0) # time.sleep(0.2) # wdname3 = u"打开" # # w3hd = win32gui.FindWindow(None, wdname3) # ”打开“ 窗口句柄 # # print w3hd # # win32gui.MoveWindow(w3hd, 50, 50, 300, 200, True) # msg = 'hello world' # edithd = win32gui.FindWindowEx(w3hd, None, "Edit", None) # win32api.SendMessage(edithd, win32con.WM_SETTEXT, None, msg) # time.sleep(0.1) # # # btnhd=win32gui.FindWindowEx(w3hd,None,"BUTTON",None) # # print btnhd # # 模拟快捷键Alt+O # win32api.keybd_event(18, 0, 0, 0) # Alt # win32api.keybd_event(79, 0, 0, 0) # O # win32api.keybd_event(79, 0, win32con.KEYEVENTF_KEYUP, 0) # 释放按键 # win32api.keybd_event(18, 0, win32con.KEYEVENTF_KEYUP, 0) # time.sleep(0.1) # # # 模拟鼠标操作 # win32api.SetCursorPos([30, 150]) # 为鼠标焦点设定一个位置 # win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) # win32api.SetCursorPos([500, 500]) # win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) # time.sleep(0.1) # # # 模拟快捷键F7(极限观察) # win32api.keybd_event(118, 0, 0, 0) # F7 # win32api.keybd_event(118, 0, win32con.KEYEVENTF_KEYUP, 0) # 释放按键 # time.sleep(0.2) # # # 利用PIL截屏 # from PIL import ImageGrab # path = "C:\\Users\\LY\\Desktop\\pic\\" # filename = "YC-" + str('xxx') + ".jpg" # im = ImageGrab.grab() # im.save(path + filename) # # # 模拟快捷键F8(回到原页面大小) # win32api.keybd_event(119, 0, 0, 0) # F8 # win32api.keybd_event(119, 0, win32con.KEYEVENTF_KEYUP, 0) # 释放按键 # # 模拟键盘事件delete # win32api.keybd_event(46, 0, 0, 0) # Delete # win32api.keybd_event(46, 0, win32con.KEYEVENTF_KEYUP, 0) # 释放按键 # time.sleep(1) # # # # 鼠标单击事件 # # #鼠标定位到(30,50) # # win32api.SetCursorPos([30,50]) # # # #执行左单键击,若需要双击则延时几毫秒再点击一次即可 # # win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) # # # #右键单击 # # win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP | win32con.MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0) # # # # def click1(x,y): #第一种 # # win32api.SetCursorPos((x,y)) # # win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0) # # win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0) # # # # def click2(x,y): #第二种 # # ctypes.windll.user32.SetCursorPos(x,y) # # ctypes.windll.user32.mouse_event(2,0,0,0,0) # # ctypes.windll.user32.mouse_event(4,0,0,0,0) # # # # def click_it(pos): #第三种 # # handle= win32gui.WindowFromPoint(pos) # # client_pos =win32gui.ScreenToClient(handle,pos) # # tmp=win32api.MAKELONG(client_pos[0],client_pos[1]) # # win32gui.SendMessage(handle, win32con.WM_ACTIVATE,win32con.WA_ACTIVE,0) # # win32gui.SendMessage(handle, win32con.WM_LBUTTONDOWN,win32con.MK_LBUTTON,tmp) # # win32gui.SendMessage(handle, win32con.WM_LBUTTONUP,win32con.MK_LBUTTON,tmp) # # # # # 发送回车 # # win32api.keybd_event(13,0,0,0) # # win32api.keybd_event(13,0,win32con.KEYEVENTF_KEYUP,0) # # # # # # # 关闭窗口 # # win32gui.PostMessage(win32lib.findWindow(classname, titlename), win32con.WM_CLOSE, 0, 0) # # # # # # # 检查窗口是否最小化,如果是最大化 # # if(win32gui.IsIconic(hwnd)): # # # win32gui.ShowWindow(hwnd, win32con.SW_SHOWNORMAL) # # win32gui.ShowWindow(hwnd, 8) # # sleep(0.5) # # # SW_HIDE:隐藏窗口并激活其他窗口。nCmdShow=0。 # # SW_MAXIMIZE:最大化指定的窗口。nCmdShow=3。 # # SW_MINIMIZE:最小化指定的窗口并且激活在Z序中的下一个顶层窗口。nCmdShow=6。 # # SW_RESTORE:激活并显示窗口。如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。在恢复最小化窗口时,应用程序应该指定这个标志。nCmdShow=9。 # # SW_SHOW:在窗口原来的位置以原来的尺寸激活和显示窗口。nCmdShow=5。 # # SW_SHOWDEFAULT:依据在STARTUPINFO结构中指定的SW_FLAG标志设定显示状态,STARTUPINFO 结构是由启动应用程序的程序传递给CreateProcess函数的。nCmdShow=10。 # # SW_SHOWMAXIMIZED:激活窗口并将其最大化。nCmdShow=3。 # # SW_SHOWMINIMIZED:激活窗口并将其最小化。nCmdShow=2。 # # SW_SHOWMINNOACTIVE:窗口最小化,激活窗口仍然维持激活状态。nCmdShow=7。 # # SW_SHOWNA:以窗口原来的状态显示窗口。激活窗口仍然维持激活状态。nCmdShow=8。 # # SW_SHOWNOACTIVATE:以窗口最近一次的大小和状态显示窗口。激活窗口仍然维持激活状态。nCmdShow=4。 # # SW_SHOWNORMAL:激活并显示一个窗口。如果窗口被最小化或最大化,系统将其恢复到原来的尺寸和大小。应用程序在第一次显示窗口的时候应该指定此标志。nCmdShow=1。
#-*- coding: utf-8 -*- ##设置编码方式 #QQ496631085 第一次没安装pywin32模块的,请自行下载 然后命令(pip instll 文件名)回车 安装哦 start_b = True #是否开始刷屏 text_button = '开始刷视频' import threading import win32gui, win32api, win32con,time,random import tkinter # import tkMessageBox def mouse_move(x,y,new_x, new_y,time_run): #移动鼠标 win32api.SetCursorPos([x,y]) #为鼠标焦点设定一个位置 time.sleep(0.1) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0,0,0,0) # 鼠标左键按下 for yy in range(y,new_y,-5): win32api.SetCursorPos([x,yy]) #为鼠标焦点设定一个位置 time.sleep(0.005) time.sleep(time_run) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0,0,0) time.sleep(time_run) def suiji_num(): #随机点击位置 y=random.randint(460,570) x=random.randint(200,280) new_x=random.randint(220,330) new_y=random.randint(100,230) return x,y,new_x,new_y def show_top(hwnd): #把窗口显示到左上角,准备点击 win32gui.MoveWindow(hwnd,0,0,480,855,True)#改变窗口大小 win32gui.SetForegroundWindow(hwnd)#指定句柄设置为前台,也就是激活 time.sleep(0.1) def kaiguan(): global start_b,text_button t= threading.Thread(target = shua) if B['text']=='停止': B['text']='开始' start_b = False print('stop') else: B['text']='停止' start_b = True print('start') t.start() def shua(): global start_b windowtitle = 'ApowerMirror' #窗口名 hwnd = win32gui.FindWindow(None, windowtitle) if hwnd>0: print('找到%s'%windowtitle) while start_b: temp=random.randint(1,3)/10 huadong=random.randint(10,15) x,y,new_x,new_y = suiji_num()#取随机点击地方 show_top(hwnd) mouse_move(x,y,new_x,new_y,temp) print(huadong) time.sleep(huadong) if huadong>13 and start_b:#点赞 show_top(hwnd) win32api.SetCursorPos([419,419]) time.sleep(0.2) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0,0,0,0) # 鼠标左键按下 time.sleep(0.1) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0,0,0) time.sleep(random.randint(1,3))#点赞后延时一下 else: win32api.MessageBox(win32con.NULL, '没有打开ApowerMirror哦', '提示:', win32con.MB_OK) top = tkinter.Tk() top.title("刷宝辅组QQ:496631085") top.geometry("330x100") B = tkinter.Button(top,text='点击开始',font=('KaiTi',36,'bold'),bg='gray',fg='red',bd=2,width=10,command=kaiguan) B.pack() top.mainloop()
# coding=utf-8 __author__ = 'Administrator' __doc__ = ''' pythonwin中win32gui的用法 本文件演如何使用win32gui来遍历系统中所有的顶层窗口, 并遍历所有顶层窗口中的子窗口 ''' import win32gui from pprint import pprint def show_window_attr(hWnd): ''' 显示窗口的属性 :return: ''' if not hWnd: return # 中文系统默认title是gb2312的编码 title = win32gui.GetWindowText(hWnd) #这里可能要把标题的gbk转换成utf-8 ,暂时不管了,可以加个函数 clsname = win32gui.GetClassName(hWnd) # print('窗口句柄:%s ' % (hWnd)) print('窗口类名:%s' % (clsname)) # str = "Chrome_WidgetWin_1" # if str == clsname: # fd = win32gui.FindWindow(clsname, None) # 查找窗口句柄 # win32gui.ShowWindow(fd, 1) # 隐藏窗口 print ('窗口句柄:%s ' % (hWnd)) print ('窗口标题:%s' % (title)) def show_windows(hWndList): for h in hWndList: show_window_attr(h) def demo_top_windows(): ''' 演示如何列出所有的顶级窗口 :return: ''' hWndList = [] win32gui.EnumWindows(lambda hWnd, param: param.append(hWnd), hWndList) show_windows(hWndList) return hWndList def demo_child_windows(parent): ''' 演示如何列出所有的子窗口 :return: ''' if not parent: return hWndChildList = [] win32gui.EnumChildWindows(parent, lambda hWnd, param: param.append(hWnd), hWndChildList) show_windows(hWndChildList) return hWndChildList hWndList = demo_top_windows() assert len(hWndList) parent = hWndList[20] # 这里系统的窗口好像不能直接遍历,不知道是否是权限的问题 hWndChildList = demo_child_windows(parent) print('-----top windows-----') pprint(hWndList) print('-----sub windows:from %s------' % (parent)) pprint(hWndChildList)
下面的代码功能是:从一个文本读取每一行记录,然后到安卓模拟器中的旺信中查询联系人,发送指定内容的消息。
# coding: utf-8 import win32gui, win32api, win32con import time import win32clipboard as w import logging def click_position(hwd, x_position, y_position, sleep): """ 鼠标左键点击指定坐标 :param hwd: :param x_position: :param y_position: :param sleep: :return: """ # 将两个16位的值连接成一个32位的地址坐标 long_position = win32api.MAKELONG(x_position, y_position) # win32api.SendMessage(hwnd, win32con.MOUSEEVENTF_LEFTDOWN, win32con.MOUSEEVENTF_LEFTUP, long_position) # 点击左键 win32api.SendMessage(hwd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, long_position) win32api.SendMessage(hwd, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, long_position) time.sleep(int(sleep)) def getText(): # 读取剪切板 w.OpenClipboard() d = w.GetClipboardData(win32con.CF_TEXT) w.CloseClipboard() return d def setText(aString): # 写入剪切板 w.OpenClipboard() w.EmptyClipboard() w.SetClipboardData(win32con.CF_TEXT, aString.encode(encoding='gbk')) w.CloseClipboard() def input_content(hwd, content, sleep, is_enter): """ 从站贴板中查找输入的内容 :param hwd: :param content: :param sleep: :param is_enter 是否要在最后输入enter键,内容与enter之间间隔一秒 :return: """ setText(content) time.sleep(0.3) click_keys(hwd, win32con.VK_CONTROL, 86) if is_enter: time.sleep(1) click_keys(hwd, win32con.VK_RETURN) time.sleep(sleep) def click_keys(hwd, *args): """ 定义组合按键 :param hwd: :param args: :return: """ for arg in args: win32api.SendMessage(hwd, win32con.WM_KEYDOWN, arg, 0) for arg in args: win32api.SendMessage(hwd, win32con.WM_KEYUP, arg, 0) def wangwang_operation(hwd, salesname, content1, content2): """ 阿里旺旺的操作 :param hwd: 句柄 :param salesname: :param content1: 发送一 :param content2: 发送二 :return: """ # 下方联系人标签 click_position(hwd, 200, 685, 2) # 新增好友按钮 click_position(hwd, 372, 44, 3) # 搜索好友 input_content(hwd, salesname, 3, False) # 点击搜索 click_position(hwd, 345, 117, 5) # 点击发送消息 click_position(hwd, 350, 700, 3) # 发送消息一 input_content(hwd, content1, 1, False) click_keys(hwd, win32con.VK_CONTROL, win32con.VK_RETURN) time.sleep(1) input_content(hwd, content2, 1, False) click_keys(hwd, win32con.VK_CONTROL, win32con.VK_RETURN) time.sleep(1) # 返回原始状态 click_position(hwd, 20, 45, 1) time.sleep(1) click_position(hwd, 20, 45, 1) def wangwang_operation_by_file(hwd, file, content1, content2): with open(file, 'r') as f: line = f.readline() while len(line) >= 1: try: line = line.replace('\r', '').replace('\n', '') print("正在处理 %s ....................................." % line) wangwang_operation(hwd, line, content1, content2) line = f.readline() except BaseException as e: print("处理 %s 时出错了............." % line) logging.exception(e) if __name__ == "__main__": # 查找句柄 hwnd = win32gui.FindWindow("Tfrm_YzzPlayer", "叶子猪手游模拟器") if int(hwnd) <= 0: print("没有找到模拟器,退出进程................") exit(0) print("查询到模拟器句柄: %s " % hwnd) win32gui.MoveWindow(hwnd, 20, 20, 405, 756, True) time.sleep(2) # 屏幕坐标到客户端坐标 # print(win32gui.ScreenToClient(hwnd, (1446, 722))) # 设置为前台 # win32gui.SetForegroundWindow(hwnd) # 设置为后台 win32gui.SetBkMode(hwnd, win32con.TRANSPARENT) time.sleep(2) # 下列的后三个参数分别表示: 文件路径 打招呼句子 广告语 wangwang_operation_by_file(hwnd, "D:/2.txt", "你好", "测试广告语")