控制台怎么写托盘程序( 四 )


5.C#编写控制台应用程序使用if语句求三个整数最大值和最小值你可以把这篇文定义为一篇蛋疼的回答,应为这个东西不怎么实用,还费神,没事折腾这做什么 。
恩,的确,蛋疼 。我也同意,就算蛋疼也有它的小众范围,当你不想做webservers,winform等,就想蛋疼的拿控制台来做服务,做程序,行吗?行,但是控制台一点关闭就退出了,有时会点错,控制台没有托盘图标,想最小化到托盘图标等,还有什么蛋疼的想法,来吧,让我们来实现他们 。
需要了解:console application是控制台程序 。控制台不是winform,我们不能设置它的关闭事件等 。
控制台虽然可以通过添加引用来增加托盘图标,但是托盘图标没有事件 。哇,怎么都是不能,那不是不能实现 。
所以你还需要了解:我们可以通过引用外部dll的api来捕获到关闭事件等 。我们可以给控制台添加消息事件循环来捕获事件响应让托盘图标可以触发事件 。
那么我们的思路是:禁用关闭按钮,让用户在控制台输入exit进行退出,当控制台被其他事件关闭时可以进行处理 。用application.doevents()来捕获消息事件处理,但是要用死循环来控制,那么我们怎么监听输入呢?我们在开一个线程用来监听输入 。
蛋疼的可以,搞个这还这么麻烦!别慌,还需要你解决的问题:先了解我给出的代码实现了什么 。实现了禁用关闭按钮,托盘图标的添加和事件的处理 。
你要做的是什么,当然你可以不做,如果你也想蛋疼一下,就来解决下这个问题吧 。退出控制台时,托盘图标没有消失,唉,这是bug,怎么解决?捕获关闭事件,在要关闭时清除托盘图标 。
先告诉你可以实现,我以实验成功,这里没有放出来是让你也蛋疼下 。好了,代码如下:/* * 控制台禁用关闭按钮并最小化到系统托盘演示 * * 通过consolewin32类来进行控制 * 添加引用 system.runtime.interopservices; 和 system.threading; 用于禁用关闭按钮 * 添加引用 system.drawing; 和 system.windows.forms; 用于系统托盘 * */ using system; using system.collections.generic; using system.linq; using system.text; using system.runtime.interopservices; using system.threading; using system.drawing; using system.windows.forms; namespace tray_beta_1 { class program { staticbool _isexit =false; staticvoid main(string[] args) { console.title ="testconsolelikewin32"; consolewin32helper.shownotifyicon(); consolewin32helper.disableclosebutton(console.title); thread threadmonitorinput =new thread(new threadstart(monitorinput)); threadmonitorinput.start(); while (true) { application.doevents(); if (_isexit) { break; } } } staticvoid monitorinput() { while (true) { string input = console.readline(); if (input =="exit") { _isexit =true; thread.currentthread.abort(); } } } } class consolewin32helper { static consolewin32helper() { _notifyicon.icon =new icon(@"g:\bruceli test\consoleapptest\consoleapps\tray\small.ico"); _notifyicon.visible =false; _notifyicon.text ="tray"; contextmenu menu =new contextmenu(); menuitem item =new menuitem(); item.text ="右键菜单,还没有添加事件"; item.index =0; menu.menuitems.add(item); _notifyicon.contextmenu = menu; _notifyicon.mousedoubleclick +=new mouseeventhandler(_notifyicon_mousedoubleclick); } staticvoid _notifyicon_mousedoubleclick(object sender, mouseeventargs e) { console.writeline("托盘被双击."); }#region 禁用关闭按钮 [dllimport("user32.dll", entrypoint ="findwindow")] staticextern intptr findwindow(string lpclassname, string lpwindowname); [dllimport("user32.dll", entrypoint ="getsystemmenu")] staticextern intptr getsystemmenu(intptr hwnd, intptr brevert); [dllimport("user32.dll", entrypoint ="removemenu")] staticextern intptr removemenu(intptr hmenu, uint uposition, uint uflags);////// 禁用关闭按钮//////控制台名字 publicstaticvoid disableclosebutton(string title) {//线程睡眠,确保closebtn中能够正常findwindow,否则有时会find失败 。