gpt4 book ai didi

c# - Process.MainWindowHandle 的意外行为

转载 作者:可可西里 更新时间:2023-11-01 09:02:39 24 4
gpt4 key购买 nike

我一直在努力理解Process.MainWindowHandle .

根据 MSDN; "主窗口是进程启动时创建的窗口。初始化后,可能会打开其他窗口,包括 Modal 和 TopLevel 窗口,但与进程关联的第一个窗口仍然是主窗口"(强调已添加)

但是在调试时我注意到 MainWindowHandle 似乎改变了值...这是我没有预料到的,尤其是在查阅了上面的文档之后。

为了确认行为,我创建了一个独立的 WinForms 应用程序,它带有一个计时器,每 100 毫秒检查一次“DEVENV”(Visual Studio) 进程的 MainWindowHandle。

这是这个测试应用程序的有趣部分...

    IntPtr oldHWnd = IntPtr.Zero;

void GetMainwindowHandle()
{
Process[] processes = Process.GetProcessesByName("DEVENV");

if (processes.Length!=1)
return;

IntPtr newHWnd = processes[0].MainWindowHandle;

if (newHWnd != oldHWnd)
{
oldHWnd = newHWnd;
textBox1.AppendText(processes[0].MainWindowHandle.ToString("X")+"\r\n");
}

}

private void timer1Tick(object sender, EventArgs e)
{
GetMainwindowHandle();
}

当您(例如)在 VS 中单击下拉菜单时,您可以看到 MainWindowHandle 的值发生变化。

MainWindowHandleMystery

也许我误解了文档。

任何人都可以阐明吗?

最佳答案

@edg,

我猜这是 MSDN 中的一个错误。您可以在 Relfector 中清楚地看到,.NET 中的“主窗口”检查看起来像:

private bool IsMainWindow(IntPtr handle)
{
return (!(NativeMethods.GetWindow(new HandleRef(this, handle), 4) != IntPtr.Zero)
&& NativeMethods.IsWindowVisible(new HandleRef(this, handle)));
}

当 .NET 代码枚举窗口时,很明显第一个可见窗口(即顶层窗口)将符合此条件。

关于c# - Process.MainWindowHandle 的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48288/

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