Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重复流程(奇怪问题)_C#_Wpf - Fatal编程技术网

C# 重复流程(奇怪问题)

C# 重复流程(奇怪问题),c#,wpf,C#,Wpf,我试图阻止多次打开帮助文件。 这是我正在使用的方法: public void openHelp() { int count = 0; string helpPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + @"\MyApp\Help\eHelp.chm"; System.Diagnostics.Process[]

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

    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,则不要启动新进程。 然而,这并不可靠。在某些情况下,它仍然会启动流程,即使其中一个已经在运行。逻辑有问题吗

多谢各位

当然,主窗口的标题是“示例应用程序帮助”,至少我在调试时看到了这一点

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

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

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

这可能是你的问题的原因吗

保留新启动的帮助查看器的进程id怎么样?在启动另一个帮助查看器之前,只需检查旧的帮助查看器是否仍然存在

int id = ...

try
{
    var proc = Process.GetProcessById(id);
}
catch
{
    // no process running with that id
}
中的备注部分包含以下注释:

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

这可能是你的问题的原因吗

保留新启动的帮助查看器的进程id怎么样?在启动另一个帮助查看器之前,只需检查旧的帮助查看器是否仍然存在

int id = ...

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

你指的是CHM帮助文件吗?是的,正是我在做的。当然,我不能按进程名“hh”(在进程中显示帮助文件)过滤掉,因为在我试图打开文件时,用户可能正在查看不同的帮助文件。如果(proc.MainModule.FileName==helpPath),请尝试
if
相反。我相信
互斥可以用来在进程之间发送信号?您是否尝试过用Spy++查看最小化窗口?您是指CHM帮助文件?是的,正是我在做的。当然,我不能按进程名“hh”(在进程中显示帮助文件)过滤掉,因为在我试图打开文件时,用户可能正在查看不同的帮助文件。如果(proc.MainModule.FileName==helpPath),请尝试
if
相反。我相信
互斥可以用来在进程之间发送信号?您是否尝试过用Spy++查看最小化窗口?这很可能是原因。我会朝这个方向挖掘,这很可能是原因。我会朝这个方向挖。