如何从MainWindowHandle获取表单?

时间:2009-05-21 21:17:26

标签: c# winforms command-line process

我有一个只允许自己运行一个实例的程序。我用这个代码

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上调用一些启动和停止方法。我可以开始了。但是从新的命令行窗口运行应用程序并尝试调用方法不起作用。我可以让窗户走到前面。有没有办法从手柄上拿出我的表格?

或者更好的方法呢?

3 个答案:

答案 0 :(得分:2)

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

如果您希望能够控制其他进程,则需要公开某种“远程访问”(其中“远程”在这种情况下意味着“进程外”,而不是“在另一台机器上” “)。这可能是通过.NET远程处理,WCF或你自己的简单协议,基于套接字,命名管道等。但是,它可能有点痛苦 - 所以权衡你真正的程度在你开始投入太多工作之前想要这个功能。

答案 1 :(得分:2)

答案 2 :(得分:1)

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

如果你真的需要与其他实例进行更多的交互,而不是简单的触发器,我将不得不使用Jon的答案,我会选择带有命名管道的WCF。正如他所说,这将是一个更复杂的解决方案,您应该考虑该功能对应用程序的重要性。