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 讨论组广告群发工具(已开发完成)索引

转载于:https://www.cnblogs.com/Rolends/archive/2012/04/24/2468287.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值