gpt4 book ai didi

c# - FindWindowEx 在子对话窗口

转载 作者:行者123 更新时间:2023-12-02 15:36:25 26 4
gpt4 key购买 nike

我正在尝试获取子对话窗口的句柄。我试过使用 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;
}

关于c# - FindWindowEx 在子对话窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16710003/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com