簡體   English   中英

子對話框窗口上的FindWindowEx

[英]FindWindowEx on child dialog window

我正在嘗試獲取子對話框窗口的句柄。 我試過使用FindWindowEx,但沒有用。 相反,FindWindow確實起作用。

我使用以下代碼對Visual Studio的“選項”窗口進行了實驗:

IntPtr vsHandle = Process.GetProcessById(vsProcessId).MainWindowHandle; // consistent with spy++'s parent handle of options window

IntPtr optionsHandle = FindWindowEx(vsHandle, IntPtr.Zero, "#32770", "Options"); // returns 0

IntPtr optionsHandle2 = FindWindow("#32770", "Options"); // returns correct handle

據我了解,FindWindowEx應該已經工作了,它是一個子窗口。

我正在運行Windows XP,並且還嘗試使用FindWindowEx(vsHandle,IntPtr.Zero,“#32770”,null)。 沒用 似乎唯一的獲得方法是使用FindWindow,因為打開具有相同對話框的兩個父實例並不足夠。

這是聲明:

[DllImport("user32.dll")]
Private static extern IntPtr FindWindow(string className, string windowTitle);
[DllImport("user32.dll")]
Private static extern IntPtr FindWindowEx(IntPtr parentHWnd, IntPtr childAfterHWnd,     string className, string windowTitle);

提前致謝。

我找到了解決方案。 FindWindowEx不起作用的原因是,它僅適用於具有WS_CHILD樣式的子窗口,而對話框窗口顯然不具有此樣式。 這就是為什么EnumChildWindows也不起作用的原因(我已經嘗試過了)。

因此,丑陋的解決方案是將EnumWindows與GetParent結合使用以比較句柄和文本。

        struct SearchData
        {
            public string WindowText;
            public IntPtr ParentHandle;
            public IntPtr ResultHandle;
        }

        delegate bool EnumWindowsCallback(IntPtr currentWindowHandle, ref SearchData searchData);

        [DllImport("user32.dll")] static extern bool EnumWindows(EnumWindowsCallback callback, ref SearchData searchData);

        [DllImport("user32.dll")] static extern IntPtr GetParent(IntPtr childHandle);

        [DllImport("user32.dll")] static extern void GetWindowText(IntPtr handle, StringBuilder resultWindowText, int maxTextCapacity);


        static bool Callback(IntPtr currentWindowHandle, ref SearchData searchData)
        {
            bool continueEnumeration = true;

            IntPtr currentWindowParentHandle = GetParent(currentWindowHandle);

            if (currentWindowParentHandle == searchData.ParentHandle)
            {
                var windowText = new StringBuilder(1024);
                GetWindowText(currentWindowHandle, windowText, windowText.Capacity);

                if (windowText.ToString() == searchData.WindowText)
                {
                    searchData.ResultHandle = currentWindowHandle;
                    continueEnumeration = false;
                }
            }

            return continueEnumeration;
        }


        IntPtr GetChildWindowHandle(string windowText, IntPtr parentHandle)
        {
            var searchData = new SearchData{ParentHandle=parentHandle, WindowText=windowText};

            EnumWindows(Callback, ref searchData);

            return searchData.ResultHandle;
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM