天天看點

cpp map 擷取所有 key_自動擷取雷電模拟器視窗句柄

每次都用指令行去擷取視窗句柄雖說不麻煩,卻是讓人很不爽的事,今天我們就來看看如何自動擷取視窗句柄。

首先,上次我們看到了擷取視窗句柄是用雷電模拟器自帶的指令行工具

dnconsole.exe,其實他和ldconsole.exe是一樣的,我個人習慣用ldconsole.exe,看官随意。

首先,安裝好雷電模拟器之後,他會在系統資料庫裡面寫一些資訊,我們就去讀這些資訊,然後通過這些資訊定位到模拟器的路徑,最後拼接出指令行工具的路徑,然後再用python調用工具,再解析傳回值,就可以順利的擷取到視窗句柄了。

系統資料庫

下面是雷電模拟器系統資料庫的位置以及資訊。

cpp map 擷取所有 key_自動擷取雷電模拟器視窗句柄

既然知道了資訊,我們就可以用他來擷取了,老套路,封裝一個函數,友善日後調用。

建立檔案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^