加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Process.MainWindowHandle的意外行为

发布时间:2020-12-15 07:48:43 所属栏目:百科 来源:网络整理
导读:我一直在努力了解 Process.MainWindowHandle. 根据MSDN “主窗口是在进程启动时创建的窗口.初始化后,可以打开其他窗口,包括Modal和TopLevel窗口,但与进程关联的第一个窗口仍然是主窗口. (加重) 但是在调试时,我注意到MainWindowHandle似乎改变了价值…我没想
我一直在努力了解 Process.MainWindowHandle.

根据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")+"rn");
        }

    }

    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代码枚举窗口时,显而易见的是,第一个可视窗口(即顶层窗口)将符合此条件.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读