我有一个只允许自己运行一个实例的程序。我用这个代码
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上调用一些启动和停止方法。我可以开始了。但是从新的命令行窗口运行应用程序并尝试调用方法不起作用。我可以让窗户走到前面。有没有办法从手柄上拿出我的表格?
或者更好的方法呢?
答案 0 :(得分:2)
您将无法获得对表单本身的引用,不 - 该对象存在于不同的进程中。
如果您希望能够控制其他进程,则需要公开某种“远程访问”(其中“远程”在这种情况下意味着“进程外”,而不是“在另一台机器上” “)。这可能是通过.NET远程处理,WCF或你自己的简单协议,基于套接字,命名管道等。但是,它可能有点痛苦 - 所以权衡你真正的程度在你开始投入太多工作之前想要这个功能。
答案 1 :(得分:2)
答案 2 :(得分:1)
如果要在远程应用程序上执行的方法很简单,您还可以使用SendMessage / PostMessage将Windows消息发送到另一个应用程序并触发要执行的操作。
如果你真的需要与其他实例进行更多的交互,而不是简单的触发器,我将不得不使用Jon的答案,我会选择带有命名管道的WCF。正如他所说,这将是一个更复杂的解决方案,您应该考虑该功能对应用程序的重要性。