C#遍歷進程獲取主窗口句柄


當我們啟動一個程序,用 Process process = Process.Start(path);//path是程序的絕對路徑

啟動時,獲取的process.Handle其實是進程的句柄,並不是窗口的句柄,而有時process.MainWindowHandle卻等於0

此時就需要用枚舉來獲取啟動進程的主窗口句柄了,代碼如下

 /// <summary>
    /// 用於枚舉子窗體是的委托
    /// </summary>
    /// <param name="WindowHandle">窗體句柄</param>
    /// <param name="num">自定義</param>
    /// <returns></returns>
    public delegate bool EnumChildWindow(IntPtr WindowHandle, string num);
    /// <summary>
    /// 獲取指定窗體的所有子窗體
    /// </summary>
    /// <param name="WinHandle">窗體句柄</param>
    /// <param name="ec">回調委托</param>
    /// <param name="name">自定義</param>
    /// <returns></returns>
    [DllImport("User32.dll")]
    public static extern int EnumChildWindows(IntPtr WinHandle, EnumChildWindow ecw, string name);
    /// <summary>
    /// 獲取指定窗體的標題
    /// </summary>
    /// <param name="WinHandle">窗體句柄</param>
    /// <param name="Title">緩沖區取用於存儲標題</param>
    /// <param name="size">緩沖區大小</param>
    /// <returns></returns>
    [DllImport("User32.dll")]
    public static extern int GetWindowText(IntPtr WinHandle, StringBuilder Title, int size);
    /// <summary>
    /// 獲取窗體類型
    /// </summary>
    /// <param name="WinHandle">窗體句柄</param>
    /// <param name="Type">類型</param>
    /// <param name="size">緩沖區大小</param>
    /// <returns></returns>
    [DllImport("user32.dll")]
    public static extern int GetClassName(IntPtr WinHandle, StringBuilder Type, int size);

    /// <summary>
    /// 根據句柄獲得進程id值
    /// </summary>
    /// <param name="handle">句柄</param>
    /// <param name="pid"></param>
    /// <returns></returns>
    [DllImport("user32")]
    private static extern int GetWindowThreadProcessId(IntPtr handle, out int pid);
 IntPtr mainHwnd = IntPtr.Zero;//登錄窗口句柄
string typeName = string.Empty;//啟動程序的窗口標題

   /// <summary>
    /// 枚舉窗體
    /// </summary>
    /// <param name="handle"></param>
    /// <param name="num"></param>
    /// <returns></returns>
    private bool EnumChild(IntPtr handle, string num)
    {
        StringBuilder title = new StringBuilder();
        //StringBuilder type = new StringBuilder();
        title.Length = 100;
        //type.Length = 100;

        GetWindowText(handle, title, 100);//取標題
        //GetClassName(handle, type, 100);//取類型

        if (title.ToString() == typeName)
        {
            mainHwnd = handle;
            return false;
        }
        return true;
    }


//代碼調用
pubilc boolTest()
{
       FileVersionInfo myFileVersion = FileVersionInfo.GetVersionInfo(path);
        typeName = myFileVersion.ProductName;//獲取程序產品名稱
int waitTime = 0;
     while (true)
            {
               
                EnumChildWindow ecw = new EnumChildWindow(EnumChild);
                EnumChildWindows(mainWindowHandle, ecw, "");

                GetWindowRect(mainHwnd.ToInt32(), ref rectMain);
                int pid = 0;
                GetWindowThreadProcessId(mainHwnd, out pid);
                //rectMain.Height - rectMain.Y < 300說明是登錄窗口
                if (mainHwnd != IntPtr.Zero && process.Id == pid && rectMain.Height - rectMain.Y < 300)//276                
                    break;
                waitTime++;
                //30秒沒打開程序,登錄失敗
                if (waitTime >= 30)
                    return false;
                Thread.Sleep(1000);
            }
return true;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM