[C#] 透過 Win32 EnumWindows 和 GetWindowText 取得所有執行程式的hWnd還有標題

2017-05-19

筆記一下,基本上這一陣陣子都在弄一些視窗程式,至於程式碼從哪邊來的,我也忘記了,很有可能來自於stackoverflow 大家可以透過關鍵字去找找看,主要是紀錄一下,關鍵的地方也不完全是我寫的,主要的目的就是抓到所有執行中的程式並且把他的視窗title印出來,這樣可以拿來判斷那程式的hWnd 會有助於之後你要對他進行一些win32 的操控,我想這是第一步。

畫面:
image

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++ 比對一下是否抓取正確

image

因為Spy++預設都是用16進位顯示所以hWnd 我都是用16進位顯示,看起來是一樣的,給碰到有需要的人,因為網路上案例很多,有些我執行起來都不成功,這邊有我測試過的結果就分享給網路上有碰到且需要的人。 :)

 

source code :
https://github.com/donma/GetAllWindowsHwnd


當麻許的超技八 2014 | Donma Hsu Design.