首頁  >  文章  >  後端開發  >  C# WindowsAPI應用程式之GetDesktopWindow-取得桌面所有視窗句柄的方法詳解

C# WindowsAPI應用程式之GetDesktopWindow-取得桌面所有視窗句柄的方法詳解

黄舟
黄舟原創
2017-03-11 13:30:304886瀏覽


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 =“user32.dll”, EntryPoint = “GetDesktopWindow”, CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr GetDesktopWindow();

【說明】
#  取得代表整個螢幕的一個視窗(桌面視窗)句柄
【返回值】
  Long,桌面視窗的句柄

取得桌面所有視窗句柄的方法


建立項目


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