C# WindowsAPI应用之GetDesktopWindow-获得桌面所有窗口句柄的方法详解


当前第2页 返回上一页

【说明】
  获得代表整个屏幕的一个窗口(桌面窗口)句柄
【返回值】
  Long,桌面窗口的句柄

获得桌面所有窗口句柄的方法


创建项目

文件->新建->项目…
这里写图片描述

API导入

GetDesktopWindow

1

<p style="margin-bottom: 7px;">/// <summary><br>        /// 该函数返回桌面窗口的句柄。桌面窗口覆盖整个屏幕。桌面窗口是一个要在其上绘制所有的图标和其他窗口的区域。<br>        /// 【说明】获得代表整个屏幕的一个窗口(桌面窗口)句柄.<br>        /// </summary><br>        /// <returns>返回值:函数返回桌面窗口的句柄。</returns><br>        [DllImport("user32.dll", EntryPoint = "GetDesktopWindow", CharSet = CharSet.Auto, SetLastError = true)]        <br>        static extern IntPtr GetDesktopWindow();<br></p>

GetWindow

1

2

3

4

5

6

7

8

9

10

11

12

/// <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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

/// <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

      寻找窗口的所有者

 */

编写方法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

/// <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# WindowsAPI应用之GetDesktopWindow-获得桌面所有窗口句柄的方法详解的详细内容!

返回前面的内容

相关阅读 >>

C#教程】C# 数据类型

C#开发之winform(公共控件)

C#最齐全的上传图片方法介绍

详解C#执行存储过程并将结果填充到gridview的示例代码

如何在C#中使用bogus去创建模拟数据

C#中泛型委托的示例代码分享(图)

C#从枚举值获取对应文本的图文代码详解

C# sleep延时方法

unity 3d 浅谈shader 运行时状态及渲染模式遇到的问题

详细介绍C#中new的几种用法

更多相关阅读请进入《C#》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...