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
View Code
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()
Python调用pywin32模拟触屏滑动 刷宝视频,自动刷视频
# 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", "你好", "测试广告语")
View Code
posted @ 2019-09-07 00:53  码迷-wjz  阅读(3329)  评论(0编辑  收藏  举报