1、建一个WinForm程序—TestIconForm,将其属性ShowInTaskbar改为false,这样程序将不会在任务栏中显示;将MaximizeBox属性设置为false,屏蔽掉最大化按钮;把StartPosition属性改为CerternScreen,这样程序运行后,窗口将会居中显示。
2、在工具栏中的公共控件里,拖入NotifyIcon控件—NotifyIcon1,这个是程序运行任务栏右侧通知区域图标显示控件。
3、在工具栏中的菜单和工具栏里,拖入ContextMenuStrip—ContextMenuStrip1,这个控件是右击时关联菜单。
4、右键NotifyIcon1选择属性,将其属性ContextMenuStrip改加为testContextMenuStrip,这个时候1和2两个步骤的两个控件就关联了,用于完成上面(3)功能。
5、右键testContextMenuStrip选择属性,进入Items,然后点击“添加”,这里添加三个菜单选项:exitMenuItem、hideMenuItem、showMenuItem,同时分别将其Text属性改为:退出、隐藏和显示。
private void OPCValue_Load(object sender, EventArgs e) { this.Hide(); } #region 托盘处理 private void OPCValue_FormClosing(object sender, FormClosingEventArgs e) { e.Cancel = true; HideMainForm(); } private void OPCValue_SizeChanged(object sender, EventArgs e) { if (this.WindowState == FormWindowState.Minimized) { HideMainForm(); } } private void ShowMenuItem_Click(object sender, EventArgs e) { ShowMainForm(); } private void HideMenuItem_Click(object sender, EventArgs e) { HideMainForm(); } private void ExitMenuItem_Click(object sender, EventArgs e) { ExitMainForm(); } #region 处理窗体的 显示 隐藏 关闭(退出) private void ExitMainForm() { if (MessageBox.Show("您确定要退出OPC数据接收程序吗?", "确认退出 ", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.OK) { this.notifyIcon1.Visible = false; this.Close(); this.Dispose(); Application.Exit(); } } private void HideMainForm() { this.Hide(); } private void ShowMainForm() { this.Show(); this.WindowState = FormWindowState.Normal; this.Activate(); } #endregion private void notifyIcon1_DoubleClick(object sender, EventArgs e) { if (this.WindowState == FormWindowState.Normal) { this.WindowState = FormWindowState.Minimized; HideMainForm(); } else if (this.WindowState == FormWindowState.Minimized) { ShowMainForm(); } } #endregion
只运行一个程序运行代码:
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; namespace OPCValues { static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { int processCount = 0; Process[] pa = Process.GetProcesses();//获取当前进程数组。 foreach (Process PTest in pa) { if (PTest.ProcessName == Process.GetCurrentProcess().ProcessName) { processCount += 1; } } if (processCount > 1) { MessageBox.Show(null, "相同的程序已经在运行了,请不要同时运行多个程序!\n\n这个程序即将退出!", Application.ProductName + "退出程序", MessageBoxButtons.OK, MessageBoxIcon.Warning); // Application.Exit(); return; } Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new OPCValue()); } } }