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

author author     2023-04-11     284

关键词:

如果双击桌面图标 判断该程序是否运行 如果运行 调出托盘中该程序 如果没有运行则启动该程序 要怎么写啊???就想千千静听一样。

这个或许需要用一个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());

本回答被提问者采纳
参考技术B //双击托盘
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中如何让窗口最小化时直接最小化到托盘,后台运行

...,为控件notifyIcon1的属性Icon添加一个icon图标。3.添加窗体最小化事件(首先需要添加事件引用):代码如下:this.SizeChanged+=newSystem.EventHandler(this.Form1_SizeChanged);//上面一行是主窗体InitializeComponent()方法中需要添加的引用privatevoidForm1_Siz... 查看详情

winform最小化到托盘,托盘右击菜单显示

添加notifyIcon控件,并添加Icon,否则托盘没有图标(托盘右键菜单也可直接在属性里添加);主要的代码:publicpartialclassForm1:Form{#region//创建NotifyIcon对象NotifyIconnotifyicon=newNotifyIcon();//创建托盘图标对象Iconico=newIcon("u9.ico");//创建托... 查看详情

winform之窗口最小化到托盘及右键图标显示菜单

  Form最小化是指整个Form都缩小到任务栏上,但是窗体以Form的标题栏形式显示在任务栏上,若是想让Form以Icon的形式显示在任务栏右下角,则需要给Form添加一个NotifyIcon控件。一、添加NotifyIcon控件  1如下图为窗体添加一个Not... 查看详情

c#最小化到托盘+双击托盘恢复+禁止运行多个该程序(代码片段)

托盘程序的制作:1.添加notifyIcon控件,并添加Icon,否则托盘没有图标(托盘右键菜单也可直接在属性里添加);2.响应Form的Resize或SizeChanged消息://HidetosystemtrayprivatevoidForm1_Resize(objectsender,EventArgse)if(this.WindowState==FormWindowState.Minimi 查看详情

C#全局热键在第一次最小化到托盘时不起作用,但在显示并再次最小化后它起作用

】C#全局热键在第一次最小化到托盘时不起作用,但在显示并再次最小化后它起作用【英文标题】:C#Globalhotkeyswon\'tworkinfirstminimizetotraybutaftershowingandminimizeagainitworks【发布时间】:2014-04-1308:48:54【问题描述】:对不起,如果我错... 查看详情

c#公共控件之notifyicon将窗口最小化到托盘

 1、设置窗体和notifyIcon属性notifyIcon ,添加contextMenuStrip控件并集成到notifyIcon 的ContextMenuStrip上。窗体2、代码usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.D 查看详情

c#winform启动最小化到任务栏右侧通知栏并交互操作

C#winForm启动最小化到任务栏右侧通知栏并交互操作一。主要功能:(1)、程序启动自动隐藏到任务栏右侧通知栏显示。(与系统托盘同义)(2)、双击系统托盘图标显示、隐藏窗口;(3)、右击系统托盘图标提供三个菜单选项,“... 查看详情

将应用程序最小化到系统托盘

】将应用程序最小化到系统托盘【英文标题】:minimizeapptosystemtray【发布时间】:2011-11-2908:07:35【问题描述】:我有一个由C#和VisualStudio2010提供支持的Windows窗体应用程序。如何将我的应用程序最小化到系统托盘(不是任务栏),... 查看详情

c#中怎样在winform窗体右上角最小化左边添加一个按钮?像q2013登录界面那种设置的按钮?

...),然后在这个窗体上放置三个按钮于右上角(分别为关闭,最小化,设置),然后将图片应用到这个button上.这里也要注意一点,如果小想看起来效果很好,也需要用winform重绘进行,关键类:Graphics.参考技术AC#vs自带的WINFORM不带这种功能,你... 查看详情

从 winForms 移植到 Windows phone 8.0 C#

】从winForms移植到Windowsphone8.0C#【英文标题】:PortfromwinFormstoWindowsphone8.0C#【发布时间】:2016-06-1021:29:33【问题描述】:有人可以通过将winForms中编写的这段c#代码移植/翻译到Windowsphone8.0来帮助我吗?我真的很挣扎,我无法让它工... 查看详情

最小化到系统托盘区是啥意思?

...的快捷键没改过的话可以通过ctrl+alt+z打开参考技术A就是最小化到通知区域,程序没关闭,只是最小化了,而且放在显示时间那的“通知区域” 参考技术B就是最小化到屏幕右下角那里,那个区域就是系统托盘了。 查看详情

vc如何实现关闭时最小化到托盘

点击X时最小化到托盘,最好给出完整的源代码。你给的这个答案,我已经在网上看过了,你的ToTray()是什么时候调用的尤其上你说的第二步,程序怎么就最小化到托盘区了我的邮箱:zhangjun_fy@163.com谢谢参考技术A一、托盘简介... 查看详情

最小化到托盘程序是啥意思?通俗点哈

...QQ,一开始登陆之后QQ界面是在桌面上显示的,当你点击最小化按钮之后,QQ就是最小化到托盘了。托盘就是windows界面的右下角那块区域,哪里还有显示时间、网络连接、声音图标。最小化大到托盘之后,程序就后台运行了。最... 查看详情

如何把程序最小化到托盘图标

参数及返回值说明:dwMessage:[输入参数]说明要执行的动作。动作的可选值如下:NIM_ADD增加一个图标到托盘区NIM_DELETE从托盘区删除一个图标NIM_MODIFY修改图标NIM_SETFOCUS将焦点(Focus)返回托盘区。这个消息通常在托盘区图标完成... 查看详情

怎么将窗口最小化到托盘

...非常的实用!而体积也仅100多KB而已~,就是将任何程序最小化到托盘中,这样,在工作时打开一堆软件就不会把任务栏撑满了。。呵呵~小小的提高了工作效率~它的功能包括:1、设置任何Windows窗口的半透明度2、使任何Windows... 查看详情

怎么设置程序启动后最小化到托盘?

设了个自启动的程序,运行方式最小化,也设置了最小化到托盘。但启动后会先最小化到桌面下方,要打开在点击最小化才会到托盘。怎么设置程序启动后自动最小化到托盘?要实现将程序最小化到托盘,就要截获WM_SIZE消息,... 查看详情

我用c#进行winform编程,关于progressbar的用法

窗口里有一个progressBar控件,和一个按钮控件..按钮的作用是导出数据库里的信息 ...我的目地就是让progressBar显示数据导出的进度.我该如何写代码?正导出的量/总数据量得到值乘100转成整数,就是百分比了progressBar的最大值设100,... 查看详情

win10定制版qq怎么最小化到托盘

...QQ在托盘里还有.或者按那个"+"选择隐藏界面,然后最小化就什么也看不到了,托盘里也没有了,要呼出的话按CTRL+ALT+C就可以啦.追问win10定制版,不是普通版参考技术A菜单键+d,或者直接点解软件右上角缩小功能键就可以,就... 查看详情