根据类名及标题名查询句柄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键。