我用C# 编写的winform 最小化到托盘了
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我用C# 编写的winform 最小化到托盘了相关的知识,希望对你有一定的参考价值。
如果双击桌面图标 判断该程序是否运行 如果运行 调出托盘中该程序 如果没有运行则启动该程序 要怎么写啊???就想千千静听一样。
这个或许需要用一个WINAPI函数SendMessage。其实大部分的WINAPI函数,C#都已经封装好,但是这次用到的这个就不清楚了,可能是我们没有找到吧(也许是根本没封装)。首先需要在program.cs文件里面修改,代码请参考下面,最好把代码粘进VS里面看,否则你会头大的
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
//在窗体启动之前就要做判断处理
//Foreach系统中的所有进程
foreach(Process p in Process.GetProcesses())
//这里面是简单的判断,先判断进程中是否有和打开程序映像名称一样的
if(p.ProcessName ==Process.GetCurrentProcess().ProcessName)
//如果映像名称一样,那么看看进程的PID和当前进程的PID是不是一样,如果一样的PID,那么就是我们这次打开程序的本身了
//如果不一样,那么自然就是之前已经打开过的了,要是找到这样的进程,那么我们就可以处理了。
//当然,如果真正使用,你需要比对文件的MD5码,通过p.MainModule.FileName可以获得进程的文件名(DLL或者是EXE)
//然后通过一个文件MD5码计算的函数(网上到处都有)得出这两个MD5码是不是一样,从而判断出是不是一个程序
//这样判断,不但可以避免两个不同程序同一个映像引起的误判,还能够判断出将EXE文件改名,更换路径的运行情况
//不过一般的小判断用我实例的方法就可以了
if (p.Id != Process.GetCurrentProcess().Id)
//API出场了.向另一个进程的主窗口发送消息。
//p.MainWindowHandle是获得已运行程序的主窗口句柄
//0x8001则是自定义消息代码.从0x8000后的都是自定义消息代码,之前的是系统消息,不要乱发送
//所谓的按键精灵就是这样的原理,对窗口句柄发送各种各样的系统消息(鼠标,键盘操作的),当然那个更深奥
SendMessage(p.MainWindowHandle, (uint)0x8001, 0, "");
//入口点程序返回,也就是这个程序直接退出了
return;
//这块就是正常的开始执行程序了,如果上面没找到,那么这个程序就打开
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
//声明调用系统API,也就是SendMessage
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(IntPtr hWnd, uint Msg,int wParam, string lParam);
然后我们需要在程序的主窗口捕获这个消息。重载form的WndProc函数。参考代码
public partial class Form1 : Form
public Form1()
InitializeComponent();
//重载 WndProc,这个函数就是消息捕获函数,参数m就是消息了
//如果你在这里加上断点,就能看到窗口捕获了各种0x8000以下的系统消息
protected override void WndProc(ref Message m)
switch (m.Msg)
//判断下捕获的消息,如果使我们刚才自定义的0x8001,就按照我们的想法处理
//这里我是把窗口的标题改变了,你可以自行按照需求来改
case 0x8001:
this.Text = "FORMFORM";
break;
//如果是其他的消息,那么就按照原先的步骤来处理系统消息
default:
base.WndProc(ref m);
break;
参考技术A 这个 很成熟了 直接给你代码
调试调用就好了
先在winform中添加notifyIcon控件,然后激活相应事件,添加代码。因为屏蔽了关闭窗体事件,可以设定一个全局变量bool变量来分辨是哪里引起的close事件。
1. //全家变量bool closeTag = true;
2
.3. //最小化
4. private void form1_Resize(object sender, EventArgs e)
5.
6. if (this.WindowState == FormWindowState.Minimized)
7.
8. NormalToMinimized();
9.
10.
11. //close时最小化
12. private void form1_FormClosing(object sender, FormClosingEventArgs e)
13.
14. e.Cancel = true;
15. NormalToMinimized();
16.
17. //单击显示窗体
18. private void notifyIcon_MouseClick(object sender, MouseEventArgs e)
19.
20. if (e.Button == MouseButtons.Left)
21.
22. this.MinimizedToNormal();
23.
24.
25. private void MinimizedToNormal()
26.
27. this.Visible = true;
28. this.WindowState = FormWindowState.Normal;
29. notifyIcon.Visible = false;
30.31.
32. private void NormalToMinimized()
33.
34. this.WindowState = FormWindowState.Minimized;
35. this.Visible = false;
36. this.notifyIcon.Visible = true;
37.
38. private void frmMain_FormClosing(object sender, FormClosingEventHandler e)
39.
40. if (closeTag)
41.
42. e.Cancel = true;
43. NormalToMinimized();
44.
45.
46.//托盘右键关闭事件
47. private void 退出XToolStripMenuItem_Click(object sender, EventArgs e)
48.
49. closeTag = false;
50. Application.Exit();
51. 追问
我说的是如果程序正在执行,双击桌面该程序的快捷方式,显示该程序界面。应该双击快捷方式的时候判断程序是否正在执行吧?
追答o
明白
在main做个判断,代码如下,
using System.Threading;//添加一下
修改系统Main函数:
bool bCreatedNew;
//Create a new mutex using specific mutex name
Mutex md =new Mutex( false, "test", out bCreatedNew );
if( bCreatedNew )
Application.Run(new main());
private void objNotify_DoubleClick(object sender, EventArgs e)
if (!this.Visible)
this.Visible = true;
//
private void frmMain_VisibleChanged(object sender, EventArgs e)
switch (this.Visible)
case true:
AnimateWindow(this.Handle, 1000, AW_BLEND | AW_ACTIVATE); // 居中逐渐显示。
this.Activate(); // 激活窗体并给予它焦点。
break;
case false:
AnimateWindow(this.Handle, 1000, AW_BLEND | AW_HIDE); // 剧中逐渐隐藏。
objNotify.ShowBalloonTip(10, this.Text, " ", ToolTipIcon.Info);
break;
private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
if (e.CloseReason == CloseReason.UserClosing)
this.Visible = false;
this.ShowInTaskbar = false;
e.Cancel = true;
以上是关于我用C# 编写的winform 最小化到托盘了的主要内容,如果未能解决你的问题,请参考以下文章
C# 实现WinForm窗口最小化到系统托盘代码,并且判断左右鼠标的事件