其實我在前面的文章已提到過如何實現窗體遍歷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;
}
通過這方法我們實現對所有窗體的獲取
題外話:今天徹底離職,心情好,多寫點