>  기사  >  백엔드 개발  >  C# WindowsAPI 애플리케이션 GetDesktopWindow - 데스크탑의 모든 창 핸들을 얻는 방법에 대한 자세한 설명

C# WindowsAPI 애플리케이션 GetDesktopWindow - 데스크탑의 모든 창 핸들을 얻는 방법에 대한 자세한 설명

黄舟
黄舟원래의
2017-03-11 13:30:304819검색


Windows API


응용 프로그램 실행 조정, 메모리 할당, 리소스 관리 외에도 다중 운영 체제인 Windows도 대규모입니다. 서비스 센터는 이 서비스 센터의 다양한 서비스(각 서비스는 함수임)를 호출합니다. 이는 응용 프로그램이 창을 열고, 그래픽을 그리며, 주변 장치를 사용하는 등의 작업을 도울 수 있습니다. 왜냐하면 이러한 기능에 의해 제공되는 객체는 응용 프로그램(응용 프로그램)이기 때문입니다. 이를 응용 프로그래밍 인터페이스(Application Programing Interface), 줄여서 API 함수라고 합니다. WIN32 API는 Microsoft Windows 32비트 플랫폼의 애플리케이션 프로그래밍 인터페이스입니다.

GetDesktopWindow


함수 함수: 이 함수는 데스크톱 창의 핸들을 반환합니다. 바탕 화면 창은 전체 화면을 덮습니다. 바탕 화면 창은 모든 아이콘과 기타 창이 그려지는 영역입니다.
함수 프로토타입: HWND GetDesktopWindow(VOID)
매개변수: 없음.
반환값: 이 함수는 데스크톱 창의 핸들을 반환합니다.
빠른 확인: Windows NT: 버전 3.1 이상, Windows: 버전 95 이상:
헤더 파일 : Winuser.h; .
【선언】
vb
공개 선언 함수 GetDesktopWindow Lib “user32” 별칭 ​​“GetDesktopWindow” () As Long
vb_net
공개 선언 함수 GetDesktopWindow Lib “user32” 별칭 ​​“GetDesktopWindow” () As Integer
c#
[DllImport(“user32.dll”, EntryPoint = “GetDesktopWindow” ”, CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr GetDesktopWindow();

[Description]
 를 나타내는 창(데스크톱 창) 핸들을 가져옵니다. 전체화면
[반환값]
길다, 바탕화면 창의 핸들

바탕화면의 모든 창 핸들을 구하는 방법


프로젝트 만들기

파일->새로 만들기->프로젝트…
C# WindowsAPI 애플리케이션 GetDesktopWindow - 데스크탑의 모든 창 핸들을 얻는 방법에 대한 자세한 설명

API 가져오기

GetDesktopWindow

<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

        /// <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# WindowsAPI 애플리케이션 GetDesktopWindow - 데스크탑의 모든 창 핸들을 얻는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.