首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子对话框窗口上的FindWindowEx

子对话框窗口上的FindWindowEx
EN

Stack Overflow用户
提问于 2013-05-23 17:17:57
回答 1查看 8.3K关注 0票数 2

我正在尝试获取一个子对话框窗口的句柄。我试过使用FindWindowEx,但它不起作用。相反,FindWindow确实起作用了。

我用visual studio的选项窗口做了一个实验,代码如下:

代码语言:javascript
复制
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,但这并不够好,因为可以打开具有相同对话框的两个父实例。

这是声明:

代码语言:javascript
复制
[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);

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-05 16:16:07

我找到了解决这个问题的办法。FindWindowEx不工作的原因是因为它只在具有WS_CHILD样式的子窗口上工作,而显然对话框窗口没有这种样式。这就是为什么EnumChildWindows也不能工作的原因(我试过了)。

因此,丑陋的解决方案是结合使用EnumWindows和GetParent来比较句柄和文本。

代码语言:javascript
复制
        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;
        }
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16710003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档