C# Windows API应用之基于GetDesktopWindow获得桌面所有窗口句柄的方法
本文实例讲述了C# Windows API应用之基于GetDesktopWindow获得桌面所有窗口句柄的方法。分享给大家供大家参考,具体如下:
Windows API
Windows 这个多作业系统除了协调应用程序的执行、分配内存、管理资源…之外, 它同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程式达到开启视窗、描绘图形、使用周边设备等目的,由于这些函数服务的对象是应用程序(Application), 所以便称之为 Application Programming Interface,简称 API 函数。WIN32 API也就是Microsoft Windows 32位平台的应用程序编程接口。
GetDesktopWindow
函数功能:该函数返回桌面窗口的句柄。桌面窗口覆盖整个屏幕。桌面窗口是一个要在其上绘制所有的图标和其他窗口的区域。
函数原型:HWND GetDesktopWindow(VOID)
参数:无。
返回值:函数返回桌面窗口的句柄。
速查:Windows NT:3.1以上版本;Windows:95以上版本:
头文件:Winuser.h;库文件:user32.lib。
【声明】
vb:
Public Declare Function GetDesktopWindow Lib “user32” Alias “GetDesktopWindow” () As Long
vb_net:
Public Declare Function GetDesktopWindow Lib “user32” Alias “GetDesktopWindow” () As Integer
c#:
[DllImport(“user32.dll”, EntryPoint = “GetDesktopWindow”, CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr GetDesktopWindow();
【说明】
获得代表整个屏幕的一个窗口(桌面窗口)句柄
【返回值】
Long,桌面窗口的句柄
获得桌面所有窗口句柄的方法
创建项目
文件->新建->项目…
API导入
GetDesktopWindow
/// <summary> /// 该函数返回桌面窗口的句柄。桌面窗口覆盖整个屏幕。桌面窗口是一个要在其上绘制所有的图标和其他窗口的区域。 /// 【说明】获得代表整个屏幕的一个窗口(桌面窗口)句柄. /// </summary> /// <returns>返回值:函数返回桌面窗口的句柄。</returns> [DllImport("user32.dll", EntryPoint = "GetDesktopWindow", CharSet = CharSet.Auto, SetLastError = true)] static extern IntPtr GetDesktopWindow();
GetWindow
/// <summary> /// 该函数返回与指定窗口有特定关系(如Z序或所有者)的窗口句柄。 /// 函数原型:HWND GetWindow(HWND hWnd,UNIT nCmd); /// </summary> /// <param name="hWnd">窗口句柄。要获得的窗口句柄是依据nCmd参数值相对于这个窗口的句柄。</param> /// <param name="uCmd">说明指定窗口与要获得句柄的窗口之间的关系。该参数值参考GetWindowCmd枚举。</param> /// <returns>返回值:如果函数成功,返回值为窗口句柄;如果与指定窗口有特定关系的窗口不存在,则返回值为NULL。 /// 若想获得更多错误信息,请调用GetLastError函数。 /// 备注:在循环体中调用函数EnumChildWindow比调用GetWindow函数可靠。调用GetWindow函数实现该任务的应用程序可能会陷入死循环或退回一个已被销毁的窗口句柄。 /// 速查:Windows NT:3.1以上版本;Windows:95以上版本;Windows CE:1.0以上版本;头文件:winuser.h;库文件:user32.lib。 /// </returns> [DllImport("user32.dll", SetLastError = true)] static extern IntPtr GetWindow(IntPtr hWnd, GetWindowCmd uCmd);
GetWindowCmd
/// <summary> /// 窗口与要获得句柄的窗口之间的关系。 /// </summary> enum GetWindowCmd : uint { /// <summary> /// 返回的句柄标识了在Z序最高端的相同类型的窗口。 /// 如果指定窗口是最高端窗口,则该句柄标识了在Z序最高端的最高端窗口; /// 如果指定窗口是顶层窗口,则该句柄标识了在z序最高端的顶层窗口: /// 如果指定窗口是子窗口,则句柄标识了在Z序最高端的同属窗口。 /// </summary> GW_HWNDFIRST = 0, /// <summary> /// 返回的句柄标识了在z序最低端的相同类型的窗口。 /// 如果指定窗口是最高端窗口,则该柄标识了在z序最低端的最高端窗口: /// 如果指定窗口是顶层窗口,则该句柄标识了在z序最低端的顶层窗口; /// 如果指定窗口是子窗口,则句柄标识了在Z序最低端的同属窗口。 /// </summary> GW_HWNDLAST = 1, /// <summary> /// 返回的句柄标识了在Z序中指定窗口下的相同类型的窗口。 /// 如果指定窗口是最高端窗口,则该句柄标识了在指定窗口下的最高端窗口: /// 如果指定窗口是顶层窗口,则该句柄标识了在指定窗口下的顶层窗口; /// 如果指定窗口是子窗口,则句柄标识了在指定窗口下的同属窗口。 /// </summary> GW_HWNDNEXT = 2, /// <summary> /// 返回的句柄标识了在Z序中指定窗口上的相同类型的窗口。 /// 如果指定窗口是最高端窗口,则该句柄标识了在指定窗口上的最高端窗口; /// 如果指定窗口是顶层窗口,则该句柄标识了在指定窗口上的顶层窗口; /// 如果指定窗口是子窗口,则句柄标识了在指定窗口上的同属窗口。 /// </summary> GW_HWNDPREV = 3, /// <summary> /// 返回的句柄标识了指定窗口的所有者窗口(如果存在)。 /// GW_OWNER与GW_CHILD不是相对的参数,没有父窗口的含义,如果想得到父窗口请使用GetParent()。 /// 例如:例如有时对话框的控件的GW_OWNER,是不存在的。 /// </summary> GW_OWNER = 4, /// <summary> /// 如果指定窗口是父窗口,则获得的是在Tab序顶端的子窗口的句柄,否则为NULL。 /// 函数仅检查指定父窗口的子窗口,不检查继承窗口。 /// </summary> GW_CHILD = 5, /// <summary> /// (WindowsNT 5.0)返回的句柄标识了属于指定窗口的处于使能状态弹出式窗口(检索使用第一个由GW_HWNDNEXT 查找到的满足前述条件的窗口); /// 如果无使能窗口,则获得的句柄与指定窗口相同。 /// </summary> GW_ENABLEDPOPUP = 6 } /*GetWindowCmd指定结果窗口与源窗口的关系,它们建立在下述常数基础上: GW_CHILD 寻找源窗口的第一个子窗口 GW_HWNDFIRST 为一个源子窗口寻找第一个兄弟(同级)窗口,或寻找第一个顶级窗口 GW_HWNDLAST 为一个源子窗口寻找最后一个兄弟(同级)窗口,或寻找最后一个顶级窗口 GW_HWNDNEXT 为源窗口寻找下一个兄弟窗口 GW_HWNDPREV 为源窗口寻找前一个兄弟窗口 GW_OWNER 寻找窗口的所有者 */
编写方法
/// <summary> /// 获得桌面所有窗口句柄的方法 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { dataGridView1.Rows.Clear(); //1、获取桌面窗口的句柄 IntPtr desktopPtr = GetDesktopWindow(); //2、获得一个子窗口(这通常是一个顶层窗口,当前活动的窗口) IntPtr winPtr = GetWindow(desktopPtr, GetWindowCmd.GW_CHILD); //3、循环取得桌面下的所有子窗口 while (winPtr != IntPtr.Zero) { //4、继续获取下一个子窗口 winPtr = GetWindow(winPtr, GetWindowCmd.GW_HWNDNEXT); } }
更多关于C#相关内容感兴趣的读者可查看本站专题:《C#窗体操作技巧汇总》、《C#数据结构与算法教程》、《C#常见控件用法教程》、《C#面向对象程序设计入门教程》及《C#程序设计之线程使用技巧总结》
希望本文所述对大家C#程序设计有所帮助。
栏 目:C#教程
本文标题:C# Windows API应用之基于GetDesktopWindow获得桌面所有窗口句柄的方法
本文地址:https://www.xiuzhanwang.com/a1/C_jiaocheng/6292.html
您可能感兴趣的文章
- 01-10C#实现自定义windows系统日志的方法
- 01-10C#3.0使用EventLog类写Windows事件日志的方法
- 01-10C#使用windows服务开启应用程序的方法
- 01-10C#实现将应用程序设置为开机启动的方法
- 01-10C#操作 JSON方法汇总
- 01-10C#图片处理3种高级应用
- 01-10C#中Json字符串的各种应用类实例讲解
- 01-10C#实现托盘程序并禁止多个应用实例运行的方法
- 01-10解析C#中断言与异常的应用方式及异常处理的流程控制
- 01-10Windows系统中使用C#读取文本文件内容的小示例
阅读排行
本栏相关
- 01-10C#通过反射获取当前工程中所有窗体并
- 01-10关于ASP网页无法打开的解决方案
- 01-10WinForm限制窗体不能移到屏幕外的方法
- 01-10WinForm绘制圆角的方法
- 01-10C#实现txt定位指定行完整实例
- 01-10WinForm实现仿视频播放器左下角滚动新
- 01-10C#停止线程的方法
- 01-10C#实现清空回收站的方法
- 01-10C#通过重写Panel改变边框颜色与宽度的
- 01-10C#实现读取注册表监控当前操作系统已
随机阅读
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-11ajax实现页面的局部加载
- 04-02jquery与jsp,用jquery
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-10C#中split用法实例总结
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10SublimeText编译C开发环境设置
- 01-10delphi制作wav文件的方法