python pywin32 的学习笔记

根据类名及标题名查询句柄hwnd

语法 :
hwnd = win32gui. FindWindow(ClassName, WindowName )
参数为类名与标题,如果没有或不确定,可以写None
实例:
hwnd = win32gui. FindWindow(‘None’, ‘xindunjs - 接待中心’)

根据类名及标题名查询Parent窗体的子窗体

PyHANDLE = FindWindowEx(Parent, ChildAfter , ClassName , WindowName )
实例:

Childhwnd = win32gui. FindWindowEx(hwnd,0, ‘WWUI.SuperListView’,None)

遍历子窗口

语法:
EnumChildWindows(hwnd, callback, extra)
实例:

hwndChildlist=[]
#所有子窗口句柄存入hwndChildList列表,参数hwnd 为父窗口句柄
win32gui.EnumChildWindows(hwnd, lambda hwnd, param: param.append(hwnd),  hwndChildList)
cl = hwndChildlist
    #遍历列表找到标题是edit 的窗体
    for i in cl:
        print("句柄:%s    列名:%s   信息:%s" % (i, win32gui.GetClassName(i), win32gui.GetWindowText(i)))
        if win32gui.GetWindowText(i)=='edit' :
            return i
            break

根据窗口句柄获取窗口DC

hdDC = win32gui.GetWindowDC(hwnd)
hwnd为None时返加屏幕DC

将窗口放在前台,并激活该窗口

win32gui.SetForegroundWindow(hwnd)

获取窗口位置

left, top, right, bottom = win32gui.GetWindowRect(SLVhwnd)
#GetWindowRect返回窗口的四个值分别为左,顶,右,底

通过键盘模拟向窗口输入文字

# 输入文字VK_CODE[word]为要输入的文字码
def key_input(self, input_words=''):
    for word in input_words:
        win32api.keybd_event(VK_CODE[word], 0, 0, 0) #按下键
        win32api.keybd_event(VK_CODE[word], 0, win32con.KEYEVENTF_KEYUP, 0)#松开按键
        time.sleep(0.1)
    time.sleep(2)

通过SendMessage接口向窗口输入文字

	Text=“要输入的文本”
    Edithwnd =find_chinld_info(handle, "RichEditComponent")# 找到窗体
    print('RichEditComponent句柄:',Edithwnd)
    time.sleep(1)
    win32gui.SendMessage(Edithwnd, win32con.WM_SETTEXT,None,Text)#写入文字
    time.sleep(1)

模拟光标在指定位置点击

def mouse_left_click( new_x, new_y):
    win32api.SetCursorPos((new_x, new_y))#设
    time.sleep(1)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)  # 鼠标按下
    time.sleep(0.1)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)  # 鼠标抬起

窗口的最小化,关闭,还原

 #向窗口发送命令,SC_RESTORE还原,SC_MINIMIZE最小化,SC_MAXIMIZE最大货
 win32gui.SendMessage(shwnd, win32con.WM_SYSCOMMAND, win32con.SC_RESTORE, 0)
 # 将窗口放在前台,并激活该窗口(窗口不能最小化)
 win32gui.SetForegroundWindow(hwnd)
 

获得当前鼠标位置:

def get_curpos():

  	return win32gui.GetCursorPos()

获得指定位置窗口:

def get_win_handle(pos):

  	return win32gui.WindowFromPoint(pos)

发送回车的方法:

win32gui.SendMessage(tid, win32con.WM_SETTEXT, None, ‘hello')
win32gui.PostMessage(tid, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
win32gui.PostMessage(tid, win32con.WM_KEYUP, win32con.VK_RETURN, 0)

模拟鼠标点击:

def click(handle, 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)

  	win32api.SendMessage(handle, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, tmp) 

 	win32api.SendMessage(handle, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, tmp)

API函数介绍

(1) 模拟鼠标动作API函数mouse_event,它可以实现模拟鼠标按下和放开等动作。

VOID mouse_event(
DWORD dwFlags, // 鼠标动作标识。
DWORD dx, // 鼠标水平方向位置。
DWORD dy, // 鼠标垂直方向位置。
DWORD dwData, // 鼠标轮子转动的数量。
DWORD dwExtraInfo // 一个关联鼠标动作辅加信息。
);

其中,dwFlags表示了各种各样的鼠标动作和点击活动,它的常用取值如下:

MOUSEEVENTF_MOVE 表示模拟鼠标移动事件。

MOUSEEVENTF_LEFTDOWN 表示模拟按下鼠标左键。

MOUSEEVENTF_LEFTUP 表示模拟放开鼠标左键。

MOUSEEVENTF_RIGHTDOWN 表示模拟按下鼠标右键。

MOUSEEVENTF_RIGHTUP 表示模拟放开鼠标右键。

MOUSEEVENTF_MIDDLEDOWN 表示模拟按下鼠标中键。

MOUSEEVENTF_MIDDLEUP 表示模拟放开鼠标中键。

(2)、设置和获取当前鼠标位置的API函数。获取当前鼠标位置使用GetCursorPos()
函数,设置当前鼠标位置使用SetCursorPos()函数。

BOOL GetCursorPos(
LPPOINT lpPoint // 返回鼠标的当前位置。
);
BOOL SetCursorPos(
int X, // 鼠标的水平方向位置。
int Y //鼠标的垂直方向位置。
);

通常游戏角色的行走都是通过鼠标移动至目的地,然后按一下鼠标的按钮就搞定
了。下面我们使用上面介绍的API

函数来模拟角色行走过程。

CPoint oldPoint,newPoint;
GetCursorPos(&oldPoint); //保存当前鼠标位置。
newPoint.x = oldPoint.x+40;
newPoint.y = oldPoint.y+10;
SetCursorPos(newPoint.x,newPoint.y); //设置目的地位置。
mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);//模拟按下鼠标右键。
mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);//模拟放开鼠标右键。

2. 键盘模拟技术

在很多游戏中,不仅提供了鼠标的操作,而且还提供了键盘的操作,在对攻击对象
进行攻击时还可以使用快捷键

。为了使这些攻击过程能够自动进行,外挂程序需要使用键盘模拟技术。像鼠标模拟技
术一样,Windows API也提供了

一系列API函数来完成对键盘动作的模拟。

模拟键盘动作API函数keydb_event,它可以模拟对键盘上的某个或某些键进行按下
或放开的动作。

VOID keybd_event(
BYTE bVk, // 虚拟键值。
BYTE bScan, // 硬件扫描码。
DWORD dwFlags, // 动作标识。
DWORD dwExtraInfo // 与键盘动作关联的辅加信息。
);

其中,bVk表示虚拟键值,其实它是一个BYTE类型值的宏,其取值范围为1-254。有
关虚拟键值表请在MSDN上使用

关键字“Virtual-Key Codes”查找相关资料。bScan表示当键盘上某键被按下和放开
时,键盘系统硬件产生的扫描码

,我们可以MapVirtualKey()函数在虚拟键值与扫描码之间进行转换。dwFlags表示各种
各样的键盘动作,它有两种取

值:KEYEVENTF_EXTENDEDKEY和KEYEVENTF_KEYUP。

下面我们使用一段代码实现在游戏中按下Shift+R快捷键对攻击对象进行攻击。

keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),0,0); //按下CTRL
键。
keybd_event(0x52,MapVirtualKey(0x52,0),0,0);//键下R键。
keybd_event(0x52,MapVirtualKey(0x52,0), KEYEVENTF_KEYUP,0);//放开R键。
keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),
KEYEVENTF_KEYUP,0);//放开CTRL键。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值