写一个SAPGUI自助登陆的python脚本程序(2)——句柄抓取

何为句柄

Windows操作系统中的句柄:
在windows程序里,各种程序的图标、窗口这些资源,都会在使用时被分配一定的内存去做处理,所以就需要有标识这些资源的符号。
叫做handle,译作句柄

所以也就是说,每一个电脑开出来的应用程序的窗口,都是有一个handle标识它的,找到它,就能定位到窗口,去做我们想做的操作。

抓取句柄

抓句柄,可以通过VisualStudio的工具spy去抓取。
如果电脑完整安装了vs的话,那么就可以在安装目录里找到它,位置是在tools的文件夹里,大概是下图的这个位置呢。

现在使用spyxx去抓。
操作就是使用Find Window,然后拖动capture到想要捕获的窗口上就好了。
需要注意的是,比如登陆gui,看上去是一个窗口,但是界面、按钮,甚至筛选器,都对应到不同的句柄。所以要注意capture捕获放置的位置。

正式操作

  1. 抓登陆gui的句柄。
  2. 在gui的句柄下,抓filter的句柄。
  3. 在filter位置输入要登陆的client,
    然后抓登陆按钮的句柄,抓到后,键入鼠标左键单击

    这样抓取窗口部分就完成了。

相关代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
client = input("\n选择登陆的Client:")

sys = {'1':'TRB', '20000':'TRC', '3':'TRD', '4':'TRF', '5000':'TRW',
'11':'PRB', '22':'PRC', '33':'PRD', '44':'PRF', '50000':'PRW'
}
link = sys[client]

…………省略部分代码…………

sap_app = r"C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.exe" #saplogon程序本地完整路径
subprocess.Popen(sap_app) # 打开程序

time.sleep(1)
flt = 0
while flt == 0:
try:
hwnd = win32gui.FindWindow(None, "SAP Logon 760")
flt = win32gui.FindWindowEx(hwnd, None, "Edit", None) # capture handle of filter,查找hwnd下第一个edit类。即筛选器。
except:
time.sleep(0.5)

# 向筛选器里写入TRB等,筛选出需要的链接。
win32gui.SendMessage(flt, win32con.WM_SETTEXT, None, link) # filter里填入文本TRB
win32gui.SendMessage(flt, win32con.WM_KEYDOWN, win32con.VK_RIGHT, 0) # 确认按下,并光标右移
win32gui.SendMessage(flt, win32con.WM_KEYUP, win32con.VK_RIGHT, 0) # 确认释放,并光标右移
time.sleep(0.1)

dlg = win32gui.FindWindowEx(hwnd, None, "Button", None) # 登陆(0)按钮
win32gui.SendMessage(dlg, win32con.WM_LBUTTONDOWN, 0) # 鼠标左键按下
win32gui.SendMessage(dlg, win32con.WM_LBUTTONUP, 0) # 鼠标左键释放

代码的部分说明:

  • 提前定义好,各个client的代号,然后根据输入的代号,对应到client,在抓到filter的句柄时,输入client代码。
  • win32gui.FindWindow()win32gui.FindWindowEx(),一个是用来抓取主界面,一个是抓取主界面附属的子界面,两个的用法有差别。

通过抓取句柄,捕获操作界面的部分,差不多就这样了。
后面再继续。