每次都用指令行去擷取視窗句柄雖說不麻煩,卻是讓人很不爽的事,今天我們就來看看如何自動擷取視窗句柄。
首先,上次我們看到了擷取視窗句柄是用雷電模拟器自帶的指令行工具
dnconsole.exe,其實他和ldconsole.exe是一樣的,我個人習慣用ldconsole.exe,看官随意。
首先,安裝好雷電模拟器之後,他會在系統資料庫裡面寫一些資訊,我們就去讀這些資訊,然後通過這些資訊定位到模拟器的路徑,最後拼接出指令行工具的路徑,然後再用python調用工具,再解析傳回值,就可以順利的擷取到視窗句柄了。
系統資料庫
下面是雷電模拟器系統資料庫的位置以及資訊。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SYmNDZzkDNmV2YhFjM1MWM2MTM0gTMlVTN3gTMmRWN08CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
既然知道了資訊,我們就可以用他來擷取了,老套路,封裝一個函數,友善日後調用。
建立檔案ld.py,以後所有模拟器相關操作都封裝到這個檔案裡面。
import winreg, osdef get_ld_dir(): try: key = winreg.OpenKeyEx(winreg.HKEY_CURRENT_USER, "Software\ChangZhi2\dnplayer") v = winreg.QueryValueEx(key, "InstallDir") winreg.CloseKey(key) return v[0] except Exception as e: print(e) return "" def get_ldconsole(): return os.path.join(get_ld_dir(), "ldconsole.exe")def get_hwnd_list(): result = [] cmd = "{} list2".format(get_ldconsole()) p = os.popen(cmd) lines = p.readlines() p.close() for line in lines: line = line.strip("\r") line = line.strip("\n") line = line.split(",") for i in range(len(line)): if i != 1: line[i] = int(line[i]) result.append(line) # 索引,标題,頂層視窗句柄,綁定視窗句柄,啟動标志,程序PID,VBox程序PID return result
函數get_ld_dir,是擷取系統資料庫裡面的資訊,原封不動的傳回出來。
函數get_ldconsole,是将路徑和我們需要的指令行工具拼接在一起,形成一個完整的路徑。
函數get_hwnd_list,是調用指令行工具的list2指令擷取目前已運作的所有模拟器的資訊,是以最後他傳回的是一個數組,比如你開了兩個視窗,它就傳回兩個資料,以此類推,隻要電腦夠強悍,100開(理論上,别較真)也不是不可以的。
我們調用的時候就像這樣,就可以拿到各個模拟器視窗的句柄了:
hws = get_hwnd_list()for h in hws: print(h[3]) # 根據格式來說,句柄是第四個,是以下标是3# 格式如下:# 索引,标題,頂層視窗句柄,綁定視窗句柄,啟動标志,程序PID,VBox程序PID
在我電腦上某次的輸出為,我開了兩個模拟器:
1348941510230
後話
那麼,截圖有了,句柄有了,接下來是不是就該進行圖檔内容分析了?
是的,就是這樣,有了圖檔就是分析了,接下來就是有點燒腦的東西了,不過呢,我也是個半吊子,我都能搞懂,各位看官也是可以的,況且隻需要了解,并不是掰開來看,是吧。^o^