Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.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#_Winforms_Project - Fatal编程技术网

C# 确定来自其他项目的表单是否已打开

C# 确定来自其他项目的表单是否已打开,c#,winforms,project,C#,Winforms,Project,我的c#WinForm解决方案包含多个项目,包括一个包含多个表单的管理项目和一个包含多个表单的用户项目。我希望我的用户表单在特定管理表单打开时表现不同 用户表单如何判断管理员表单何时打开 所有表单都没有“this.Text”值(所有这些值都为空) 当我循环遍历由'FormCollection fc=Application.OpenForms'标识的所有表单时,它不会显示来自其他项目的表单;它似乎只显示来自同一项目的表单 此外,所有管理表单都从一个.exe文件运行,所有用户表单都从另一个.exe文

我的c#WinForm解决方案包含多个项目,包括一个包含多个表单的管理项目和一个包含多个表单的用户项目。我希望我的用户表单在特定管理表单打开时表现不同

用户表单如何判断管理员表单何时打开

所有表单都没有“this.Text”值(所有这些值都为空)

当我循环遍历由'FormCollection fc=Application.OpenForms'标识的所有表单时,它不会显示来自其他项目的表单;它似乎只显示来自同一项目的表单

此外,所有管理表单都从一个.exe文件运行,所有用户表单都从另一个.exe文件运行


非常感谢您的帮助。

您需要的是进程间通信的方式。
实现这一点的方法有很多,但大多数方法对于您的情况来说都是多余的。
我认为这是最好的方法,你的情况是有一个文件,管理进程将写入,其他进程将读取和推断管理进程的状态

对该范围使用类。
互斥体是一个Windows内核对象,它具有Windows计算机的唯一标识符

public class Form2 : Form
{
    Mutex m;
    protected override void OnShown(EventArgs e)
    {
        base.OnShown(e);
        m = new Mutex(true, "Form2");
    }

    protected override void OnClosed(EventArgs e)
    {
        base.OnClosed(e);
        m.ReleaseMutex();
    }
}

public class Form3 : Form
{
    bool form2IsOpen;
    public Form3()
    {
        try
        {
            Mutex.OpenExisting("Form2");
            form2IsOpen = true;
        }
        catch (WaitHandleCannotBeOpenedException ex)
        {
            form2IsOpen = false;
        }
    }
}

你好,Serhio,谢谢你的回复。我实现了你的建议,但是我在释放互斥时遇到了麻烦。我已经发布了一个关于这个问题的详细信息的新问题。如果你有时间的话,我很感谢你看一看。新的问题在这里:@Frederik:那么,想知道,除了调用WaitOne(0)还是调用OpenExisting,解决方案是什么?我还在研究。昨天我意识到我的代码有一个弱点,在某些条件下(我测试的条件),管理表单的多个副本被打开,一个在另一个之上。这导致抛出许多异常。我将在代码正常工作后发布代码。此外,在Form2上,在调用Exit()之前应先调用Close(),否则将不会调用代码中的OnClosed方法。@Serhio:我发布了我的最终工作代码,作为对此发布的更新:。最后,我没有使用WaitOnce,而是通过确保关闭对命名互斥体的所有引用来使用OpenExisting。谢谢你的回复。我喜欢你的建议,因为它很简单;但是,我担心安全性,因为某人可能很容易更改文件中存储的值。您知道在保护文件不被操纵的情况下如何实现您的建议吗?您可以使用模拟,以另一个用户身份写入/读取文件,该用户将是唯一拥有此文件权限的用户。但是,它需要添加一个特殊的用户来添加到部署程序的机器上。互斥体解决方案更好:)但我不确定这里所写的用法是否有效。@Italy:你为什么怀疑提出的解决方案?@serhio-据我所知,如果Form2关闭,互斥体
Form2
在运行
Mutex.OpenExisting(“Form2”)时不存在
表单3上的
WaitHandleCannotBeOpenedException
将被抛出,并将错误地指示
form2IsOpen
耶。。。表2应为false。我会修这个。