【问题标题】:Duplicate process (strange issue)重复的过程(奇怪的​​问题)
【发布时间】:2012-11-25 12:20:38
【问题描述】:

我试图阻止多次打开帮助文件。 这是我正在使用的方法:

    public void openHelp()
    {
        int count = 0;
        string helpPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + @"\MyApp\Help\eHelp.chm";

        System.Diagnostics.Process[] helpProcs = System.Diagnostics.Process.GetProcesses();
        foreach (System.Diagnostics.Process proc in helpProcs)
        {
            if (proc.MainWindowTitle == "Sample App Help")
            {
                count++;
            }
        }

        if (count == 0)
        {
            System.Diagnostics.Process.Start(helpPath);
        }
        else
        {
        }
    }

这个想法是,如果您找到具有相同 MainWindowTitle 的进程,则不要启动新的进程。 然而,这并不可靠。在某些情况下,它仍然会启动该过程,即使一个已经在运行。是不是逻辑有问题?

谢谢。

附:当然 MainWindowTitle 是“Sample App Help”,至少我在调试时看到的是这样。

更新: 仅当用户最小化帮助文件时才会出现问题。所以我怀疑系统中发生了一些事情,我需要检查一些东西。有什么建议吗?

【问题讨论】:

  • 您指的是 CHM 帮助文件吗?
  • 是的,正是我正在做的。当然,我不能按进程名称“hh”过滤掉(出现在进程中的帮助文件),因为当我试图打开我的文件时,用户可能正在查看不同的帮助文件。
  • 改用if(proc.MainModule.FileName == helpPath)
  • 我相信Mutex 可以用来在进程之间发出信号?
  • 你试过用 Spy++ 查看最小化的窗口吗?

标签: c# wpf


【解决方案1】:

Process.MainWindowTitle 中的备注部分包含以下注释:

主窗口是当前具有焦点的窗口;注意 这可能不是该过程的主要窗口。您必须使用 Refresh方法刷新Process对象获取当前main 窗口句柄(如果已更改)。

这可能是您的问题的原因吗?

如何保留新启动的帮助查看器的进程 ID,在启动另一个帮助查看器之前,只需检查旧的帮助查看器是否还活着。

int id = ...

try
{
    var proc = Process.GetProcessById(id);
}
catch
{
    // no process running with that id
}

【讨论】:

  • 这很可能是原因。我会朝这个方向挖掘。
猜你喜欢
  • 2021-08-16
  • 2012-09-21
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 2017-05-17
相关资源
最近更新 更多