我认为很容易就会很快打败我。我不是本地C#程序员,但被要求创建一个具有单个实例的WinForm应用程序。我已经在StackOverflow上看到了Mutex示例,但我得知的一件事就是能够在命令行上将参数传递给窗口,解析值并使用新值重新绘制表单。
任何人都有这样的例子吗?似乎绊倒我的主要事情是线程化。我想运行my.exe并显示窗口。每次表单运行时,我都不想要新表单 - 只需获取新参数并在表单中显示它们。
感谢任何/所有回复!
答案 0 :(得分:1)
当您启动应用程序的另一个实例时,您运行相同的代码,但是在不同的进程上。所以,你需要查看passing data between processes。像命名管道或远程处理的东西。
答案 1 :(得分:0)
@lazyberezovsky是对的。从命令行再次调用应用程序将生成一个不同的,不相关的进程,并且在退出被调用的新进程之前,您需要进程间通信将新参数转发到先前运行的应用程序实例。
恕我直言,在这两个进程之间进行通信的最简单方法(不是最好的)将使用Windows注册表,因为这已经是线程安全的,并且API非常简单。首先,当应用程序运行时,在显示主窗体之前,我会perform a check to see if another instance of the app is running。
如果为false,则这是应用程序第一次运行,我将处理命令行并将表单显示为常规。我还将清除用于进程间通信的注册表项(见下文)。
如果为true,那么我会将registry中的命令行存储在将用于进程间通信的特定密钥上,然后我将终止应用程序而不显示主表单。
您正在运行的应用程序(第一个实例)将需要启动轮询机制(可能是每秒触发一次的Windows计时器),该机制会定期检查预期新命令行的注册表项。它通常会找到并清空字符串并且什么也不做,但是如果检索到的值不为空,那么这意味着用户再次使用不同的参数集生成应用程序,然后您可以继续解码命令行并重新绘制窗口有必要的。在此之后,请确保再次清除注册表项,以便轮询机制恢复并检测用户下次调用应用程序时。
命名管道,WCF,.remoting或TCP套接字是可以使用的IPC机制,不需要轮询机制,这可能是一些人不赞同的。 ;)
希望这有帮助!