C# 获取.NET Core中生成的进程的MainWindowHandle

C# 获取.NET Core中生成的进程的MainWindowHandle,c#,.net-core,process,handle,C#,.net Core,Process,Handle,我有以下代码: 私有静态无效开始(字符串路径){ var process=process.Start(新的ProcessStartInfo(路径){ WindowsStyle=ProcessWindowsStyle.Maximized, UseShellExecute=true, }); ThreadPool.QueueUserWorkItem(勾选,进程); } 私有静态无效勾号(对象对象对象){ var过程=(过程)obj; while(true){ Debug.WriteLine($“HW

我有以下代码:

私有静态无效开始(字符串路径){
var process=process.Start(新的ProcessStartInfo(路径){
WindowsStyle=ProcessWindowsStyle.Maximized,
UseShellExecute=true,
});
ThreadPool.QueueUserWorkItem(勾选,进程);
}
私有静态无效勾号(对象对象对象){
var过程=(过程)obj;
while(true){
Debug.WriteLine($“HWND:{process.MainWindowHandle}”);
睡眠(时间跨度从毫秒(10));
}
}
这将启动一个进程,然后每隔10毫秒显示一次
MainWindowHandle
属性。在.NET Framework(我测试了4.5和4.8)上,最初显示0,但一旦窗口完全呈现,就会显示实际的窗口句柄

NET Core上完全相同的代码(在2.0、2.2、3.0和3.1上测试,1.0没有必要的API)的行为不同。它要么立即知道句柄并显示数值,要么不知道,并且等待时间不会改变,它将继续显示0。这是与时间相关的,如果我在while循环之前的行中插入几毫秒的睡眠,它总是工作,没有睡眠几乎总是不工作,除非它执行得足够快

我认为使用
process.Refresh()
是为了帮助解决这个问题,但在这里似乎没有效果。我尝试在调试行之前将其添加到循环中,但没有成功

我知道API在.NET Core中发生了轻微的变化(例如,
UseShellExecute
具有不同的默认值,这就是我在示例中明确提供它的原因,只是为了排除它作为差异的可能来源),但我不知道这是否也影响了这个特定用例


这是已知的,如果是,是有意的吗?我是否在用法方面遗漏了什么?更重要的是,我如何才能可靠地获得衍生控制台窗口的
MainWindowHandle
?如果可能的话,不必使用显式等待,因为我不知道生成的进程启动需要多长时间。

。因此,这是一次尝试,您必须确保窗口实际上是创建的。非常丑陋,考虑点击按钮。可能的解决方法是首先调用WaitForInputdle()并使用反射将字段戳回false。非常感谢,这确实是问题所在。基于这个实现,我将为此提交一份PR:而且,现在我将使用
process=process.GetProcessById(process.Id)要刷新进程结构,这似乎是可行的,我不需要担心性能,因为它在程序的生命周期中只会发生几次。