[C#] 透過 Win32 EnumWindows 和 GetWindowText 取得所有執行程式的hWnd還有標題
2017-05-19
筆記一下,基本上這一陣陣子都在弄一些視窗程式,至於程式碼從哪邊來的,我也忘記了,很有可能來自於stackoverflow 大家可以透過關鍵字去找找看,主要是紀錄一下,關鍵的地方也不完全是我寫的,主要的目的就是抓到所有執行中的程式並且把他的視窗title印出來,這樣可以拿來判斷那程式的hWnd 會有助於之後你要對他進行一些win32 的操控,我想這是第一步。
1. 首先需要引入 win32 api 介面 :
[DllImport("user32.dll")] static extern int EnumWindows(CallbackDef callback, int lParam); [DllImport("user32.dll")] static extern int GetWindowText(int hWnd, StringBuilder text, int count); delegate bool CallbackDef(int hWnd, int lParam);
2. 建立一個function 作為 delegate 回報後的觸發動作
private bool ShowWindowHandler(int hWnd, int lParam) { string mystring; StringBuilder text = new StringBuilder(255); GetWindowText(hWnd, text, 255); mystring = text.ToString(); listBox1.Items.Insert(0, text + "," + Convert.ToString((int)hWnd, 16).ToUpper()); return true; }
3. 列出的程式部分:
listBox1.Items.Clear(); CallbackDef callback = new CallbackDef(ShowWindowHandler); EnumWindows(callback, 0);
結果就可以印出來,之後,我們來抓取Chrome 並且 使用Spy++ 比對一下是否抓取正確
因為Spy++預設都是用16進位顯示所以hWnd 我都是用16進位顯示,看起來是一樣的,給碰到有需要的人,因為網路上案例很多,有些我執行起來都不成功,這邊有我測試過的結果就分享給網路上有碰到且需要的人。 :)
source code :
https://github.com/donma/GetAllWindowsHwnd