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