C# Windows窗体获取(遍历)的实现

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;
}

通过这方法我们实现对所有窗体的获取

本博客所有文章如无特别注明均为原创

如果觉得对你有帮助,可以通过下方打赏对作者表示鼓励

本文采用知识共享署名-非商业性使用-相同方式共享

如若转载,请注明出处:https://www.fangsi.net/77.html

(1)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2013年5月3日 09:47
下一篇 2013年5月6日 09:21

相关推荐

发表评论

登录后才能评论