1.求助:怎么样才能用vc的win32应用程序或者是控制台程序实现托盘图
打开一个新工程,将工程文件取名为test、单元文件取名为main。
在窗口上放置二个按钮、一个标签,其属性按如下设置 组件 属性 值 Label1 Caption 按OK按钮。终止程序 OKButton Caption &OKButton CancelButton Caption &CancelButton 打开文件main.h,加入斜体部分声明(以手工输入部分均以斜体表示,以下同) class TForm1 : public TForm { __published: // IDE-managed Components TButton *OKButton; TButton *CancelButton; TLabel *Label1; void __fastcall FormCreate(TObject *Sender); void __fastcall FormDestroy(TObject *Sender); void __fastcall OKButtonClick(TObject *Sender); void __fastcall CancelButtonClick(TObject *Sender); private: // User declarations unsigned ugIconMessage; void AddTray(); void DeleteTray(); protected:virtual void __fastcall WndProc(Messages::TMessage &Message); public: // User declarations __fastcall TForm1(TComponent* Owner); }; 切换到main.cpp,加入以下函数及声明 #include#pragma hdrstop#include#include "main.h"//---------------------------------------------------------------------------#pragma package(smart_init)#pragma resource "*.dfm" TForm1 *Form1;//--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner) { }//--------------------------------------------------------------------------- void TForm1::AddTray()//创建任务栏布告区图标 { NOTIFYICONDATA icondata;① memset(&icondata,0,sizeof(icondata));② icondata.cbSize=sizeof(icondata); icondata.hWnd=Handle;③ strncpy(icondata.szTip,"我的任务",sizeof(icondata.szTip));④ Application->Icon->LoadFromFile("e:\\yxg\\map\\system\\ico\\yxg.ico"); icondata.hIcon=Application->Icon->Handle; ⑤ icondata.uCallbackMessage=ugIconMessage;⑥ icondata.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;⑦ Shell_NotifyIcon(NIM_ADD,&icondata);⑧ } void TForm1::DeleteTray()//删除任务栏布告区图标 { NOTIFYICONDATA icondata; memset(&icondata,0,sizeof(icondata)); icondata.cbSize=sizeof(icondata); icondata.hWnd=Handle; Shell_NotifyIcon(NIM_DELETE,&icondata); ⑧ } void __fastcall TForm1::WndProc(Messages::TMessage &Message) { if(Message.Msg==ugIconMessage)//如果产生的是与该图标相关的消息 { if(Message.LParam==WM_LBUTTONDBLCLK) Application->Terminate();⑨ if(Message.LParam==WM_RBUTTONDBLCLK) { ShowWindow(Application->Handle,SW_SHOW);// Application->ShowMainForm=true; Form1->Visible=true; ⑩ } return; } TForm::WndProc(Message); } ①申请一个任务栏布告区图标的结构变量;②将结构变量的内容清零;③取得当前窗口的句柄;④输入鼠标经过该图标时的提示字符串;⑤将自已所喜爱的图标文件作为任务栏布告区的图标;⑥取得回调信息变量;⑦当结构变量中成员hIcon、uCallbackMessage与szTip 出错时将给出错误标志;⑧调用函数Shell_NotifyIcon()在任务栏布告区产生或删除一个图标;⑨当鼠标左键在该图标处双击时,终止程序运行;⑩当鼠标右键在该图标处双击时,显示与该图标相关的应用程序。
我们知道,所有的TWinControl派生来的VCL类都有一个WndProc函数,调用这个函数可以发送消息并被相关的窗口接收,WndProc被定义成一个虚函数,这样一个派生类就可以定义它自已的WndProc函数来代替其父类的WndProc函数。在这里,与任务栏布告区图标相关的消息由子类的WndProc函数处理,否则调用父类的WndProc处理。
在Form1的OnCreate事件中加入以下代码: void __fastcall TForm1::FormCreate(TObject *Sender) { ugIconMessage=RegisterWindowMessage("IconNotify");① AddTray();② Form1->Visible=false;③ } ①调用RegisterWindowMessage()函数来创建一个独一无二的消息编号,以确保没有冲突;②在任务栏布告区创建图标;③显示窗体; 在Form1的OnDestroy事件中加入DeleteTray()函数以删除图标。 将OKButton与CancelButton按钮的OnClick事件增加代码以隐藏主窗口及终止程序运行。
void __fastcall TForm1::OKButtonClick(TObject *Sender) { Form1->Visible=false; ShowWindow(Application->Handle,SW_HIDE); Application->ShowMainForm=false; }//--------------------------------------------------------------------------- void __fastcall TForm1::CancelButtonClick(TObject *Sender) { Application->Terminate(); } 最后,在WinMain函数中增加两行代码以便程序在开始运行时就隐藏主窗体。 WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->Initialize(); Application->CreateForm(__classid(TForm1), &Form1); ShowWindow(Application->Handle,SW_HIDE); Application->ShowMainForm=false; Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } return 0; } 程序在C++ Builder 4 与Windows 98 环境下编译运行通。
2.VC中怎样建立一个只有系统托盘的程序
其实这个建立的过程很简单,与系统托盘通信的函数只有一个:Shell_NotifyIcon(DWORD dwMessage ,PNOTIFYICONDATA pnid)。
第一个参数dwMessage 的取值有NIM_ADD 、NIM_MODIFY及NIM_DELETE。第二个参数pnid 是NOTIFYICONDATA 结构体一个指针,结构体内容用来配合第一个参数dwMessage进行图标操作。
下面的程序,将AddSystemTrayIcon( )放到OnPaint( )下增加一个系统托盘图标,在OnDestroy或OnClose中调用DeleteSystemTrayIcon( )来删除这个系统托盘图标。
BOOL AddSystemTrayIcon()
{
HICON hIcon = AfxGetApp()->LoadIcon(IDI_ICONTRAY);
char lpszTip[]="Text Spy"; //提示信息
//给NOTIFYICONDATA 结构赋值
NOTIFYICONDATA tnid;
tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.hIcon = hIcon;
tnid.uID = IDI_ICONTRAY;
tnid.hWnd = m_hWnd;
tnid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
tnid.uCallbackMessage = WM_TASKBAR; //可以写OnTaskBar(WPARAM wParam,LPARAM lParam)函数来处理收到的消息
lstrcpyn(tnid.szTip,lpszTip,sizeof(tnid.szTip));
// lstrcpy(tnid.szTip,"Text Spy");
// ShowWindow(SW_HIDE);
return Shell_NotifyIcon(NIM_ADD,&tnid);
}
BOOL DeleteSystemTrayIcon()
{
NOTIFYICONDATA tnid;
tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.uID = IDI_ICONTRAY;
tnid.hWnd = m_hWnd;
return Shell_NotifyIcon(NIM_DELETE,&tnid);
}
LRESULT OnTaskBar(WPARRM wParam,LPARAM lParam)//WM_TASKBAR消息的响应函数
{
UINT uMouseMsg = (UINT)lParam;
switch(uMouseMsg)
{
case WM_LBUTTONDOWN:
ShowWindow(SW_SHOWNORMAL);
break;
case WM_RBUTTONUP;
MessageBox("The mouse rightkey !");
break
}
return 0;
}
3.C#如何编写调用控制台命令的语句
你可以把这篇文定义为一篇蛋疼的回答,应为这个东西不怎么实用,还费神,没事折腾这做什么。
恩,的确,蛋疼。我也同意,就算蛋疼也有它的小众范围,当你不想做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);///
Thread.Sleep(100); IntPtr windowHandle = FindWindow(null, title); IntPtr closeMenu = GetSystemMenu(windowHandle, IntPtr.Zero); uint SC_CLOSE =0xF060; RemoveMenu(closeMenu, SC_CLOSE, 0x0); } publicstaticbool IsExistsConsole(string title) { IntPtr windowHandle = FindWindow(null, title); if (windowHandle.Equals(IntPtr.Zero)) returnfalse; returntrue; }#endregion#region 托盘图标 static NotifyIcon _NotifyIcon =new NotifyIcon(); publicstaticvoid ShowNotifyIcon() { _NotifyIcon.Visible =true; _NotifyIcon.ShowBalloonTip(3000, "", "我是托盘图标,用右键点击我试试,还可以双击看看。
", ToolTipIcon.None); } publicstaticvoid HideNotifyIcon() { _NotifyIcon.Visible =false; }#endregion } }。
4.VC中怎样建立一个只有系统托盘的程序
其实这个建立的过程很简单,与系统托盘通信的函数只有一个:Shell_NotifyIcon(DWORD dwMessage ,PNOTIFYICONDATA pnid)。
第一个参数dwMessage 的取值有NIM_ADD 、NIM_MODIFY及NIM_DELETE。第二个参数pnid 是NOTIFYICONDATA 结构体一个指针,结构体内容用来配合第一个参数dwMessage进行图标操作。
下面的程序,将AddSystemTrayIcon( )放到OnPaint( )下增加一个系统托盘图标,在OnDestroy或OnClose中调用DeleteSystemTrayIcon( )来删除这个系统托盘图标。BOOL AddSystemTrayIcon(){HICON hIcon = AfxGetApp()->LoadIcon(IDI_ICONTRAY);char lpszTip[]="Text Spy"; //提示信息//给NOTIFYICONDATA 结构赋值NOTIFYICONDATA tnid;tnid.cbSize = sizeof(NOTIFYICONDATA);tnid.hIcon = hIcon;tnid.uID = IDI_ICONTRAY;tnid.hWnd = m_hWnd;tnid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;tnid.uCallbackMessage = WM_TASKBAR; //可以写OnTaskBar(WPARAM wParam,LPARAM lParam)函数来处理收到的消息lstrcpyn(tnid.szTip,lpszTip,sizeof(tnid.szTip));// lstrcpy(tnid.szTip,"Text Spy");// ShowWindow(SW_HIDE);return Shell_NotifyIcon(NIM_ADD,&tnid);}BOOL DeleteSystemTrayIcon(){NOTIFYICONDATA tnid;tnid.cbSize = sizeof(NOTIFYICONDATA);tnid.uID = IDI_ICONTRAY;tnid.hWnd = m_hWnd;return Shell_NotifyIcon(NIM_DELETE,&tnid);}LRESULT OnTaskBar(WPARRM wParam,LPARAM lParam)//WM_TASKBAR消息的响应函数{UINT uMouseMsg = (UINT)lParam;switch(uMouseMsg){ case WM_LBUTTONDOWN: ShowWindow(SW_SHOWNORMAL); break; case WM_RBUTTONUP; MessageBox("The mouse rightkey !"); break} return 0;}。
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失败。
thread.sleep(100); intptr windowhandle = findwindow(null, title); intptr closemenu = getsystemmenu(windowhandle, intptr.zero); uint sc_close =0xf060; removemenu(closemenu, sc_close, 0x0); } publicstaticbool isexistsconsole(string title) { intptr windowhandle = findwindow(null, title); if (windowhandle.equals(intptr.zero)) returnfalse; returntrue; }#endregion#region 托盘图标 static notifyicon _notifyicon =new notifyicon(); publicstaticvoid shownotifyicon() { _notifyicon.visible =true; _notifyicon.showballoontip(3000, "", "我是托盘图标,用右键点击我试试,还可以双击看看。
", tooltipicon.none); } publicstaticvoid hidenotifyicon() { _notifyicon.visible =false; }#endregion } }。
6.隐藏到我的托盘 1.23怎么用
节省任务栏空间,应对老板突击检查。
程序启动后会在当前活动窗口标题栏中间添加一个“隐”字按钮(用户可修改按钮显示文字),单击此按钮即可将当前活动窗口缩至本程序托盘菜单(请注意:被隐窗口标题成为托盘菜单中的一项,而不是将其图标缩至任务栏)。 您还可以使用热键隐藏当前活动窗口,默认隐藏热键为Ctrl+Alt+h(用户可另行设置)。
鼠标右键单击程序托盘图标,在其菜单项中找到想要恢复的窗口名称单击即可。 您还可以使用热键无限次恢复被缩至托盘菜单的窗口,默认解藏热键为Ctrl+Alt+u(用户可另行设置)。
鼠标右键单击程序托盘图标,单击托盘菜单项中的“释放所有”可以恢复所有被隐藏的窗口。 用户可以隐藏程序在任务栏的图标使程序的隐藏功能更强大。
默认的隐藏/显示托盘图标的热键为Ctrl+Alt+t(用户可另行设置)。 可使用程序目录下“设热键.exe”另行设置热键,也可手动编辑程序目录下“隐藏到我的托盘.ini”。
可以隐藏。您可以通过右键单击程序托盘图标-总控制台-按钮来隐藏或显示此功能按钮。
可以通过右键单击程序托盘图标-总控制台-设置-设置按钮文字或者通过右键单击程序托盘图标-总控制台-设置-直接编辑配置来修改之。
7.C++控制台程序怎样使主函数无限循环
for(;;)和while(TRUE)都是无限循环,只有break或者return跳出
PeekMessage不会阻塞,最后一个参数传PM_NOREMOVE,不会将消息从队列取出,可以用于检测消息队列是否有消息。有时候,当我们使用全局变量之类的方式进行线程间交互,PeekMessage很有用。
比如你用一个全局变量BOOL bStop表示线程是否停止,主线程bStop设为TRUE就是通知工作线程结束
if(PeekMessage(&iMsg,NULL,0,0,PM_NOREMOVE))
{
if(!GetMessage(&iMsg,NULL,0,0))
return iMsg.wParam;
TranslateMessage(&iMsg);
DispatchMessage(&iMsg);
}
else
{
if (bStop)
break;/*结束*/
}
追问:
我有一个程序是多线程,采用win32控制台程序编写,通过scoket对端口进行监听。
但是为了将程序最小化到托盘,采用了消息循环,但是不知道如何将监听的代码放到循环里,所以增加了一个线程专门用来监听。有没有更好的解决办法?
另外,消息循环放在主线程,对端口监听放在另一个线程里。采用上面哪个消息循环好。采用消息循环的目的是为了将窗口托盘化。
追答:
一般来说,你这种情况,主线程是界面线程,处理界面消息的,工作线程只用于网络相关操作,你的问题只在于主线程,如何能够响应界面上点了最小化按钮,是吧?
GetMessage后,取出了消息保存在iMsg中,DispatchMessage(&iMsg);会根据iMsg结构体保存的窗口句柄,去掉用对应的窗口消息处理函数,这个回调函数应该是你在注册窗口类时定义了的。在这个函数中,处理最小化消息。
最小化,是通过WM_SYSCOMMAND消息发送的,wParam等于SC_MINIMIZE时代表最小化
转载请注明出处育才学习网 » 控制台怎么写托盘程序