c# – Process.MainWindowHandle的意外行为

c# – Process.MainWindowHandle的意外行为,第1张

概述我一直在努力了解 Process.MainWindowHandle. 根据MSDN “主窗口是在进程启动时创建的窗口.初始化后,可以打开其他窗口,包括Modal和TopLevel窗口,但与进程关联的第一个窗口仍然是主窗口. (加重) 但是在调试时,我注意到MainWindowHandle似乎改变了价值…我没想到,特别是在咨询了上面的文档之后. 为了确认行为,我创建了一个带有定时器的独立WinFor 我一直在努力了解 @L_502_0@.

根据MSDN “主窗口是在进程启动时创建的窗口.初始化后,可以打开其他窗口,包括Modal和topLevel窗口,但与进程关联的第一个窗口仍然是主窗口. (加重)

但是在调试时,我注意到MainWindowHandle似乎改变了价值…我没想到,特别是在咨询了上面的文档之后.

为了确认行为,我创建了一个带有定时器的独立WinForms应用程序,每100ms检查一次“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 http://i37.tinypic.com/11ky1yb.jpg

也许我误解了文档.

任何人都有光吗?

解决方法 @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的意外行为全部内容,希望文章能够帮你解决c# – Process.MainWindowHandle的意外行为所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1244137.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存