【问题标题】:process.MainWindowHandle is zero?process.MainWindowHandle 为零?
【发布时间】:2014-03-13 08:33:04
【问题描述】:

为什么 process.MainWindowHandle 在下面的代码中为零?

Process me = Process.GetCurrentProcess();
foreach (Process process in Process.GetProcessesByName(me.ProcessName))
                    {
                        if (process.Id != me.Id)
                        {
                            MessageBox.Show(string.Format("{0}", process.MainWindowHandle));
                            ShowWindow(process.MainWindowHandle, 5);
                            ShowWindow(process.MainWindowHandle,3);
                            SetForegroundWindow(process.MainWindowHandle);
                            break;
                        }
                    }

【问题讨论】:

  • 您确定您的进程有与之关联的窗口吗?可能不会。实际的窗口可能是一个自行生成的进程。
  • 隐藏的窗口实际上是这个过程的另一个实例,它只是被 ShowWindow 隐藏了。

标签: c# .net wpf


【解决方案1】:

您的窗口被隐藏是一个非常重要的细节。

来自MSDN article on the Process.MainWindowHandle Property

只有当一个进程有一个与之关联的主窗口 一个图形界面。如果关联进程没有主 窗口,MainWindowHandle 值为零。 该值也为零 已隐藏的进程,即未隐藏的进程 在任务栏中可见。

【讨论】:

  • 谢谢。那我该怎么办?
  • 我想您可以暂时让窗口在任务栏上可见,并在短时间内使用计时器检查该窗口句柄。一旦你得到它,然后像往常一样隐藏你的过程。只要您的进程正在运行,该窗口句柄就会保持不变 (stackoverflow.com/questions/6772634/…)。即使 MainWindowHandle 返回零,只要该窗口存在,您就可以通过其他方式访问它并向其发送消息。不过,如果您使用的是表单,这似乎不太确定。那么……
  • ...您可能必须“重新创建”句柄以确保您访问的是同一个窗口。
【解决方案2】:

Process.MainWindowHandle 属性使用启发式方法来确定主窗口是什么,但这并不总是有效。 尝试使用EnumWindows。 我写了一个tutorial 来说明如何使用它。

【讨论】:

    【解决方案3】:

    在此处为已经非常出色的答案添加一件事:

    如果您打开的应用有 GUI,但仍没有显示在任务栏中,则它是 MainWindowHandle 找不到。

    例如:如果您有权访问 Winform 应用程序的代码,请转到表单的 properties 并确保在 Icon 部分中这是 True

    我的设置为False,我必须努力学习。

    【讨论】:

      猜你喜欢
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      • 1970-01-01
      • 2015-01-21
      • 2016-02-10
      • 2017-02-12
      相关资源
      最近更新 更多