介绍 本文描述了组件使Winform应用程序的单一实例。 背景 为什么另一个单一实例实现,你们中的一些人可能会问。简短的回答是,我开始与迈克尔·波特的实现但遇到问题当我试图使用一个应用程序,该应用程序最小化到explorer状态区域。本文提供的解决方案使用互斥锁来检测已经运行的实例和远程信号启动一个新的实例。 使用的代码 使用组件,必须先添加到工具箱。组件可以放到一个表单,它将显示在组件托盘。 下图显示了SingleInstance组件的属性(事件)。 对于某些应用程序,它可能是有用的安装一个InstanceActivate处理程序。每次调用处理程序的第二个实例正在开始。作为一个额外的好处,事件的参数也包含的命令行参数传递给第二个实例。隐藏,复制Code
private void singleInstance1_InstanceActivate(object sender, rr.Windows.Forms.SingleInstance.InstanceActivateEventArgs e) { foreach (string s in e.CommandLineArgs) { Debug.WriteLine(s); } }
InstanceActivate后组件的默认行为是将第一个实例的前景。为了防止,取消属性必须设置为true。隐藏,复制Code
e.Cancel=true;
的兴趣点 在测试组件XP有不同的用户帐户,而测试应用程序的一个实例已经正常运行在我的账户,我开始只有一个使用每个套接字地址(协议/网络地址/端口)通常是允许错误。我开始意识到使用一个固定的端口号不工作,所以我提供0通道自由端口号。隐藏,复制Code
TcpChannel chan = new TcpChannel(0);
但现在的问题是,客户端无法连接到服务器,因为它不知道服务器监听的端口号。考虑几个不同的方法后,我最终决定使用一个注册表键HKEY_CURRENT_USER蜂巢。 另一个让我有点不安的实现细节是我用,隐藏,复制Code
Process.GetCurrentProcess().Kill();
在表单的InitializeComponent函数终止第二个实例。前需要运行代码的实现,过程可能钩InstanceShutdown被杀事件。 历史 最初版本:4。2003年8月(1.1版) 本文转载于:http://www.diyabc.com/frontweb/news4929.html