繁体   English   中英

如何从MainWindowHandle获取表单?

[英]How to get a form from MainWindowHandle?

我有一个程序,仅允许其自身的一个实例运行。 我用这个代码

bool createdNew = true;
using(Mutex mutex = new Mutex(true, "MobilePOSServer", out createdNew))
{
    if(createdNew)
    {

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MainForm());
    }
    else
    {
        Process current = Process.GetCurrentProcess();
        foreach(Process proc in Process.GetProcessesByName(current.ProcessName))
        {
            if(proc.Id != current.Id)
            {
                SetForegroundWindow(proc.MainWindowHandle);
            }
        }
    }
}

我想做的是处理命令行参数,以在MainForm winform上调用一些start和stop方法。 我可以很好地开始。 但是从新的命令行窗口运行应用程序并尝试调用方法无法正常工作。 我可以把窗户弄到前面。 有什么办法可以从表格中获取表格吗?

还是更好的方法呢?

您将无法获得对表单本身的引用,不-该对象存在于另一个过程中。

如果您希望能够控制其他进程,则需要公开某种“远程访问”(在这种情况下,“远程”表示“进程外”,而不是“在另一台计算机上”)。 这可能是通过.NET远程,WCF或您自己的简单的协议,基于套接字,命名管道等。但是,它很可能是一个有点疼痛做-所以重达多少你真的想要这个功能,你开始把前太多的工作了。

这是您要找的东西吗?

单实例应用程序,传递命令行参数

如果要在远程应用程序上执行的方法很简单,则还可以使用SendMessage / PostMessage将Windows消息发送到其他应用程序并触发要执行的操作。

如果您真的需要与其他实例进行更多交互,而不仅仅是简单的触发器,那么我将不得不遵循Jon的回答,并选择带有命名管道的WCF。 正如他所说,这将是一个涉及更广泛的解决方案,您应该考虑该功能对于应用程序的真正重要性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM