C# Windows窗體獲取(遍歷)的實現


其實我在前面的文章已提到過如何實現窗體遍歷http://www.cnblogs.com/Rolends/archive/2012/04/19/2456907.html

windows所有的窗體都是被系統所管理的,系統以句柄的形式去表征這些窗體,我們的目標就是找到這些句柄

通過msdn可以查詢到要獲取所有的窗體需借助於EnumDesktopWindows這個api函數去實現,函數原型如下

BOOL WINAPI EnumDesktopWindows(
  __in_opt  HDESK hDesktop,
  __in      WNDENUMPROC lpfn,
  __in      LPARAM lParam
);
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682615%28v=vs.85%29.aspx
我講講這個函數吧
第一個參數是一個HDESK 類型參數,就是指定桌面的指針,如何獲取桌面指針,不在今天的話題之內,當hDesktop參數為空時,默認表示當前桌面
第二個參數WNDENUMPROC聲明的函數指針,WNDENUMPROC的聲明如下
BOOL CALLBACK EnumWindowsProc(
  __in  HWND hwnd,
  __in  LPARAM lParam
);
這函數就不解釋了窗體句柄加LPARAM參數
第三個參數是傳遞給回調的lParam值,一般為空就行
 
在C#中我們這樣聲明
聲明委托
     public delegate bool EnumDesktopWindowsDelegate(IntPtr hWnd, uint lParam);
定義API導出函數
  [DllImport("user32.dll", EntryPoint = "EnumDesktopWindows", ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool EnumDesktopWindows(IntPtr hDesktop, EnumDesktopWindowsDelegate lpEnumCallbackFunction, IntPtr lParam);

我們像下面這樣使用

  WinAPIHelper.EnumDesktopWindows(IntPtr.Zero,
            new WinAPIHelper.EnumDesktopWindowsDelegate(delegate(IntPtr hWnd, uint lparam)
            {
                if (pids.Contains(WndHelper.GetProcessId(hWnd)))
                {
                    weas.Add(GetWinArgs(hWnd));
                }
                return true;
            }),
            IntPtr.Zero);
當然你也可以分開寫

  WinAPIHelper.EnumDesktopWindows(IntPtr.Zero, new WinAPIHelper.EnumDesktopWindowsDelegate(EnumWindowsProc), IntPtr.Zero);
 bool EnumWindowsProc(IntPtr hWnd, uint lparam)
        {
            if (pids.Contains(WndHelper.GetProcessId(hWnd)))
            {
                weas.Add(GetWinArgs(hWnd));
            }
            return true;
        }

通過這方法我們實現對所有窗體的獲取

 

題外話:今天徹底離職,心情好,多寫點

 

QQ 討論組廣告群發工具(已開發完成)索引


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM