我用C# 编写的winform 最小化到托盘了

如果双击桌面图标判断该程序是否运行如果运行调出托盘中该程序如果没有运行则启动该程序要怎么写啊???就想千千静听一样。... 如果双击桌面图标 判断该程序是否运行 如果运行 调出托盘中该程序 如果没有运行则启动该程序 要怎么写啊???就想千千静听一样。 展开
 我来答
聊无无
2012-02-23 · TA获得超过1206个赞
知道小有建树答主
回答量:186
采纳率:0%
帮助的人:218万
展开全部
这个或许需要用一个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;
}
}
}
AiPPT
2024-09-19 广告
随着AI技术的飞速发展,如今市面上涌现了许多实用易操作的AI生成工具1、简介:AiPPT: 这款AI工具智能理解用户输入的主题,提供“AI智能生成”和“导入本地大纲”的选项,生成的PPT内容丰富多样,可自由编辑和添加元素,图表类型包括柱状图... 点击进入详情页
本回答由AiPPT提供
2580469282
2012-02-22 · TA获得超过247个赞
知道小有建树答主
回答量:725
采纳率:50%
帮助的人:420万
展开全部
这个 很成熟了 直接给你代码
调试调用就好了
先在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());
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
mctower
推荐于2016-01-08
知道答主
回答量:41
采纳率:0%
帮助的人:26.2万
展开全部
//双击托盘
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;
}

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式