.Net 为什么要改变 Process.MainWindowHandle?

问题描述 投票:0回答:1

我在 Visual Studio 中创建了一个新的 Windows 窗体应用程序,并向其中添加了以下代码:

new Form1().Show();

通过调用此代码,由

Process.MainWindowHandle
报告的我的流程的
Process.GetProcessById(Environment.ProcessId).MainWindowHandle
将更改为新表单。

但是,如果我再次激活第一个创建的表单,则

MainWindowHandle
将与最初创建的表单一起报告。因此,如果我是对的,
Process.MainWindowHandle
始终报告活动表单句柄,而不是最初创建的表单。

我还尝试使用

ApplicationContext
来定义其
MainForm
属性,但这不会改变任何东西。

我如何用 C# 在 .Net 中定义一个

MainForm
,它的句柄将始终由
Process.MainWindowHandle
报告,无论它是活动的还是隐藏的?

c# .net winapi process
1个回答
0
投票

您可以在名称和窗口之间创建静态可用的

Map
。因此,如果您想在特定窗口上执行某些操作,那么您可以通过此
Map
按名称加载该窗口。这当然意味着每当创建一个窗口时,它都需要反映到这个Map中,并且每当一个窗口被释放时,也需要调整Map。

关于您的实际问题,请查看此资源:https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.process.mainwindowhandle?view=net-8.0

特别是这部分:

主窗口是当前具有焦点的进程(顶级窗体)打开的窗口。如果主窗口句柄已更改,则必须使用 Refresh 方法刷新 Process 对象才能获取最新的主窗口句柄。一般来说,因为窗口句柄被缓存,所以事先使用刷新来保证您将检索到当前句柄。

因此,无论通过聚焦表单来刷新 TopLevel 属性,例如您调用的

Show
方法,都会相应地更改主窗口句柄。如果您期望发生不同的情况,那么您将需要自己实现该逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.