VC++托盘编程

合集下载

VC++6.0子用户界面线程及托盘的实现

VC++6.0子用户界面线程及托盘的实现

VC++6.0子用户界面线程及托盘的实现
张钟
【期刊名称】《电脑编程技巧与维护》
【年(卷),期】2003(000)007
【摘要】本文通过示例程序介绍了应用程序的托盘及子用户界面线程的创建以及线程间消息的通信方式。

【总页数】4页(P49-52)
【作者】张钟
【作者单位】
【正文语种】中文
【中图分类】TP31
【相关文献】
1.VC++6.0多线程技术在端口扫描程序中的应用 [J], 岳峰
2.Windows 98下利用VC++6.0实现多线程技术的方法 [J], 应珊红
3.VC++6.0下利用互斥量同步线程来实现文件读取进度条 [J], 李新川
4.在VC++6.0下采用多线程实现DCS控制系统远程数据采集的探索 [J], 杨冰莲
5.实现用户界面线程时的问题及解决方法 [J], 叶益东;陈一民;何永义
因版权原因,仅展示原文概要,查看原文内容请购买。

VC制作最小化托盘

VC制作最小化托盘

VC++制作一个最小化最小托盘的8步骤Introduction这篇文章解析了Shell_NotifyIcon这个函数用法--用来建立你自己的应用程序的系统托盘图标.这篇文章给了基本的缩小到托盘的操作过程并让你从中了解.这篇文章提供8个简单的步骤让你成功的实现在你的程序中建立系统托盘图标.源代码提供了一个基于对话框的演示程序.Tray Icons为了用托盘图标你需要用一个shell函数:)BOOL Shell_NotifyIcon( DWORD dwMessage, PNOTIFYICONDATA pnid );ThedwMessage可选的参数包括theNIM_ADD,NIM_DELETE and NIM_MODIFY功能分别是添加删除以及修改图标于系统图标.PNOTIFYICONDATA结构包括这些系统需要处理的任务图标状态区域消息等信息.typedef struct _NOTIFYICONDATA {DWORD cbSize;HWND hWnd;UINT uID;UINT uFlags;UINT uCallbackMessage;HICON hIcon;#if (_WIN32_IE < 0x0500)TCHAR szTip[64];#elseTCHAR szTip[128];#endif #if (_WIN32_IE >= 0x0500)DWORD dwState;DWORD dwStateMask;TCHAR szInfo[256];union {UINT uTimeout;UINT uVersion;} DUMMYUNIONNAME;TCHAR szInfoTitle[64];DWORD dwInfoFlags;#endif #if (_WIN32_IE >= 0x600)GUID guidItem;#endif} NOTIFYICONDATA, *PNOTIFYICONDATA;*Note: 更完全的信息可以去参考MSDNCreating the ApplicationCreate a new VC++ dialog based project and call it TrayMin.创建一个名叫TrayMin的基于对话框的VC++工程Step: 1自定义消息于TrayMinDlg.h 头文件.#define WM_TRAY_MESSAGE (WM_USER + 1)TheWM_USER常量用来帮助用户定义自己的消息被用来建立个人的窗口类, 定义时通常用这种格式WM_USER+X, 这里X 是一个整形变量.*更详细的看MSDNStep: 2现在在Now add the DECLARE_MESSAGE_MAP() 之前添加下面的用户函数吧(TrayMinDlg.h file)afx_msg void OnTrayNotify(WPARAM wParam, LPARAM lParam);当添加一个图标到托盘时这有一个图标的回调消息,注意到NOTIFYICONDATA结构中有uCallbackMessage成员是回调消息识别的关键,它会被传给NIM_ADD(我们之后将会见到更详细的)。

用VisualC#做托盘程序.net-电脑资料

用VisualC#做托盘程序.net-电脑资料

用VisualC#做托盘程序.net-电脑资料下一页1 2 3 所谓托盘程序顾名思义就是象托起的盘子一样的程序,。

而所谓的托起的盘子就是程序运行中显示出的图标,而托起的位置就是视窗系统的的工具栏了。

托盘程序具有直观、占用屏幕空间较小并且可以为它定义多个功能菜单,这就给操作者带来了方便,所以下一页 1 2 3所谓托盘程序顾名思义就是象托起的盘子一样的程序。

而所谓的托起的盘子就是程序运行中显示出的图标,而托起的位置就是视窗系统的的工具栏了。

托盘程序具有直观、占用屏幕空间较小并且可以为它定义多个功能菜单,这就给操作者带来了方便,所以越来越多的程序设计者都把程序设计成托盘这种方式。

我们已经看过了用其他语言设计托盘程序的例子,其中的大部分,整个设计过程还是相对烦琐的。

而对于微软公司极力推荐的下一代程序开发语言--Visual C#来说,却可以十分方便设计出一个托盘程序。

本文就是介绍Visual C#设计托盘程序的具体过程。

首先来介绍一下本文中设计托盘程序所需要的环境:(1).微软公司视窗2000服务器版(2) FrameWork SDK Beta 2一.托盘程序的主要步骤及解决方法:为什么说用Visual C#可以十分方便的做一个托盘程序,主要的原因是在.Net框架的软件开发包( .Net FrameWork SDK )中的WinForm 组件中定义了一个专门用来开发托盘程序的组件--NotifyIcon组件,电脑资料《用Visual C#做托盘程序.net》(https://www.)。

下面就来介绍一下这个组件的具体用法和程序设计中的主要的技巧。

(1).如何在程序运行后隐藏窗体:我们知道托盘程序运行后是无法看见主窗体的,他只会显示在工具栏上。

在用Visual C#设计此类程序的时候,可以用二种方法使得程序运行后不显示主窗体。

其中一种方法是重载主窗体中的OnActivated( )事件,OnActivated( )事件是在窗体激活的时候才触发的。

VC中系统托盘图标的实现

VC中系统托盘图标的实现

VC中系统托盘图标的实现本文以实例代码的形式讲述了在VC中系统托盘图标的实现。

技术实现:在VC中实现系统托盘图标主要用到一个Shell_NotifyIcon系统API。

在本文中我们以对话框程序为例子实现系统托盘图标,步骤如下:1.在StdAfx.h中定义消息ID,如:#define MYWM_NOTIFYICON WM_USER+12.定义一个全局NOTIFYICONDATA变量,如:NOTIFYICONDATA g_nd;3.实现添加系统托盘图标函数,如:void CZTXClientDlg::AddSystrayIcon(){// 将图标放入系统托盘g_nd.cbSize = sizeof (NOTIFYICONDATA);g_nd.hWnd = m_hWnd;g_nd.uID = IDR_MAINFRAME;g_nd.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;g_nd.uCallbackMessage= MYWM_NOTIFYICON;g_nd.hIcon = m_hIcon;strcpy(g_nd.szTip, "知天下娱乐中心[V1.1]");Shell_NotifyIcon(NIM_ADD, &g_nd);}4.实现删除系统托盘图标函数,如:void CZTXClientDlg::DelSystrayIcon(){Shell_NotifyIcon(NIM_DELETE, &g_nd);5.重载WindowProc函数,如:LRESULT CZTXClientDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam){// TODO: Add your specialized code here and/or call the base classswitch( message ){case MYWM_NOTIFYICON:if(lParam==WM_LBUTTONDBLCLK){AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW);}else if(lParam==WM_RBUTTONDOWN){CMenu menu;//载入事先定义的选单menu.LoadMenu(IDR_TRADEMEMU);CMenu*pMenu=menu.GetSubMenu(0);CPoint pos;GetCursorPos(&pos);//加入SetForegroundWindow的目的为使用户点菜单之外时菜单可以消失::SetForegroundWindow(m_hWnd);pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBU TTON,pos.x,pos.y,AfxGetMainWnd());}break;}return CDialog::WindowProc(message, wParam, lParam);6. OK,现在在我们的OnInitDialog函数中加入如下代码:AddSystrayIcon( );7.在窗口关闭函数中加入如下代码:DelSystrayIcon( );经测试可行!非常感谢!。

vc实现系统托盘图标

vc实现系统托盘图标

vc实现系统托盘图标Windows中,任务栏的右边(托盘)常驻有几个图标,如输入法切换图标、音量控制图标等系统图标,而一些在后台执行实时监控或其他任务的软件如金山词霸、瑞星杀毒软件等也只是在托盘上放一个小小的图标,几乎不占用本来就拥挤不堪的桌面,而且必要时我们还可以通过用鼠标点击图标对其进行菜单操作或激活其主窗口。

如果在我们编制的一些类似的在后台工作的实时监控软件里加入上述功能,无疑会使程序显得很有专业水准。

虽然有不少介绍系统托盘方面编程的文章,但大多是讲述如何在SDK下用Windows API编写的,这样做显然是非常烦琐的,本文以一个SDI(单文档界面)程序为例,讲述了在MFC框架程序中此类程序的实现过程。

[喝小酒的网摘]/a/1117.htm二、程序的设计思路在编制此类程序时,为了不干扰前台程序的运行界面和不显示不必要的窗口,应使其运行时的主窗口不可见。

同时,又要让用户知道该程序正在运行,并且能达到与用户进行交互的目的。

将一个图标显示在任务栏右端系统托盘区中并响应用户的鼠标动作是当前非常流行的方法。

要使程序的主窗口不可见,并且不在任务栏上出现任务按钮,需要分别设置主边框窗口的风格和扩展风格;另外,利用系统函数Shell_NotifyIcon可以将一个图标显示在任务栏的通告区中。

剩下的任务就是如何通过这个图标来响应用户的操作,可以象其他软件如WinAmp 一样通过弹出式菜单来完成同用户的交互。

三、程序的具体实现(一)主界面的隐藏前面已经提过,要求程序运行开始时主窗口不可见,同时也不出现在任务栏中,在SDK下是通过修改入口函数WinMain中的API函数 CreatWindow的参数来实现的,在MFC下已经对其进行了封装,使我们无法直接对WinMain函数内部进行访问与修改,不过可以通过MFC提供的另外一个接口--在主框架类的预创建窗口函数中设定主框架窗口的风格和扩展风格来实现之:BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {if( !CFrameWnd::PreCreateWindow(cs) )return FALSE;cs.style=WS_POPUP;cs.dwExStyle |=WS_EX_TOOLWINDOW;return TRUE;}其中,CREATESTRUCT结构中的style成员变量设定了主框架窗口的风格,在此设定为WS_POPUP;而dwExStyle成员变量则对主框架窗口的扩展风格做了描述,只需在原有基础上为其再增添一种WS_EX_TOOLWINDOW扩展属性即可使其不会出现在任务条上。

利用Visual C++实现系统托盘程序

利用Visual C++实现系统托盘程序

利用Visual C++实现系统托盘程序这些程序运行时不显示运行窗口,只在任务栏上显示一个图标,表示程序正在运行,用户可以通过鼠标与应用程序交互,程序开发人员有时也需要编制一些仅在后台运行的类似程序,为了不干扰前台程序的运行界面和不显示不必要的窗口,应使程序运行时的主窗口不可见。

同时将一个图标显示在任务栏右端静态通告区中并响应用户的鼠标动作。

本实例就介绍Visual C++开发这类程序的设计方法,该程序编译运行后,如果双击托盘图标,程序会弹出一个消息列表窗口,只要鼠标在托盘图标上移动或点击(无论是左右键的单击或双击),产生的消息都会显示在这个窗口里;当鼠标光标移到托盘图标上时,在图标附近会显示提示信息;单击右键时弹出上下文菜单,这个菜单中应包含打开属性页的命令或者打开与图标相关的其它窗口的命令,另外,该程序还可以动态的改变托盘的图标。

参照这个例子,相信读者能轻松自如地在自己的程序中应用系统托盘。

一、实现方法为了实现拖盘程序,首先要使程序的主窗口不可见,这点实现起来十分容易,只要调用ShowWindow(SW_HIDE)就可以了,本实例采用的就是这种方法,还有一种思路是通过分别设置主边框窗口的风格和扩展风格来隐藏主框架:在任务条上显示图标是利用系统API函数Shell_NotifyIcon()来将一个图标显示在任务栏的通告区中。

该函数的原型为:该函数的第一个参数dwMessage类型为DWORD,表示要进行的动作,它可以是下面的值之一:NIM_ADD:添加一个图标到任务栏。

NIM_MODIFY:修改状态栏区域的图标。

NIM_DELETE:删除状态栏区域的图标。

NIM_SETFOCUS:将焦点返回到任务栏通知区域。

当完成用户界面操作时,任务栏图标必须用此消息。

例如,如果任务栏图标正显示上下文菜单,但用户按下"ESCAPE"键取消操作,这时就必须用此消息将焦点返回到任务栏通知区域。

VC++如何在托盘区显示程序图标》瀑布集

VC++如何在托盘区显示程序图标》瀑布集

VC++如何在托盘区显示程序图标》瀑布集在全局头文件里面定义:cpp代码1.#define WM_NOTIFYICON (WM_APP+100)1:初始化cpp代码1.//systray 通知2.NOTIFYICONDATA tnd;3.tnd.cbSize=sizeof(NOTIFYICONDATA);4.tnd.hWnd=this->m_hWnd;5.tnd.uID=IDR_MAINFRAME;6.tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;7.tnd.uCallbackMessage=WM_NOTIFYICON;8.tnd.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRE SOURCE(IDR_MAINFRAME));9.strcpy(tnd.szTip,"我的程序...");10.Shell_NotifyIcon(NIM_ADD,&tnd);2.当explorer退出重启时重新显示托盘区图标,如果不处理则不会显示重载回调函数DefWindowProc:cpp代码1.LRESULT CMyDlg::DefWindowProc(UINT message, WPAR AM wParam, LPARAM lParam)2.{3.// TODO: Add your specialized code here and/or call the base class4.static UINT s_uTaskbarRestart;5.if (message == WM_CREATE)6.s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));7.if(message == s_uTaskbarRestart)8.{9.NOTIFYICONDATA tnd;10.tnd.cbSize=sizeof(NOTIFYICONDATA);11.tnd.hWnd=this->m_hWnd;12.tnd.uID=IDR_MAINFRAME;13.tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;14.tnd.uCallbackMessage=WM_NOTIFYICON;15.tnd.hIcon=LoadIcon(AfxGetInstanceHandle(),16.MAKEINTRESOURCE(IDR_MAINFRAME));17.strcpy(tnd.szTip,"我的程序...");18.Shell_NotifyIcon(NIM_ADD,&tnd);19.}20.return CDialog::DefWindowProc(message, wParam, lPa ram);21.}3.程序退出时托盘区图标处理,如果不处理,则托盘区仍然有该无意义的图标cpp代码1.NOTIFYICONDATA tnid;2.tnid.cbSize=sizeof(NOTIFYICONDATA);3.tnid.hWnd=this->m_hWnd;4.tnid.uID=IDR_MAINFRAME;5.Shell_NotifyIcon(NIM_DELETE,&tnid);4.在托盘区图标上添加菜单可以添加一个下拉式菜单:cpp代码1.//头文件里面添加消息函数:(注意添加位置,别搞错了)2.afx_msg void OnNotifyIcon(WPARAM wParam,LPARAM lP aram);3.4.//实现文件里面添加消息映射:(注意添加位置,别搞错了)5.ON_MESSAGE(WM_NOTIFYICON,OnNotifyIcon)6.7.//函数大概:8.void CMyDlg::OnNotifyIcon(WPARAM wParam,LPARAM lP aram)9.{10.UINT uID=(UINT)wParam;11.UINT uMouseMsg=(UINT)lParam;12.if(uID==IDR_MAINFRAME)13.{14.CMenu menu;15.CMenu *pPopup;16.CPoint pt;17.switch(uMouseMsg)18.{19.case WM_RBUTTONDOWN:20.menu.LoadMenu(IDR_TrayMenu);//IDR_TrayMenu 为存在的一个下拉式菜单资源名21.pPopup=menu.GetSubMenu(0);22.GetCursorPos(&pt);23.pPopup->TrackPopupMenu(TPM_RIGHTBUTTON,pt.x, pt.y,this);24.break;25.case WM_LBUTTONDOWN:26.ShowWindow(SW_SHOWDEFAULT);27./*28.menu.LoadMenu(IDR_TrayMenu);//IDR_TrayMenu 为存在的一个下拉式菜单资源名29.pPopup=menu.GetSubMenu(0);30.GetCursorPos(&pt);31.pPopup->TrackPopupMenu(TPM_RIGHTBUTTON,pt.x, pt.y,this);32.*/33.break;34.}35.}36.}实现菜单后,又可以对菜单的鼠标点击做出其他的动作,在此不在赘述。

任务栏托盘图标及右键菜单实现

任务栏托盘图标及右键菜单实现

VC++任务栏托盘图标及右键菜单实现作者:xingzhe826 日期:2013年11月14日1.创建单文档工程TaskQMenu2.设置图标右键菜单,ID为IDR_TPMENU3.初始化托盘图标// 初始化托盘图标NOTIFYICONDATA nifd; // NOTIFYICONDATA 结构声明nifd.cbSize = sizeof(NOTIFYICONDATA); // NOTIFYICONDATA 结构体大小nifd.hWnd = m_hWnd; // 标识窗口:接收与托盘图标相关的消息 nifd.uID = IDR_MAINFRAME; // 指定任务栏图标nifd.uFlags = NIF_MESSAGE // 指定该结构体变量的那些成员变量有效| NIF_ICON| NIF_TIP;nifd.uCallbackMessage = WM_UIMSG; // 自定义消息标识:当托盘图标发生鼠标事// 件或使用键盘选择或激活图标时,系统将// 次标识向hWnd窗口发送消息 nifd.hIcon = theApp.LoadIcon(IDR_MAINFRAME);// 图标句柄lstrcpy(nifd.szTip, _T("提示文本")); // 托盘图标提示文本Shell_NotifyIcon(NIM_ADD, &tnd); // 安装托盘图标4.消息处理BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)ON_MESSAGE(WM_UIICON, OnNotifyIcon) // WM_UIICON消息映射END_MESSAGE_MAP()afx_msg LRESULT OnNotifyIcon(WPARAM wParam, LPARAM lParam);// 消息处理LRESULT CMainFrame::OnNotifyIcon(WPARAM wParam, LPARAM lParam){UINT uID; // 发出该消息的消息的图标IDUINT uMouseMsg; // 鼠标消息uID = (UINT)wParam; // 参数解析并赋值uMouseMsg = (UINT)lParam;if(WM_LBUTTONDOWN == uMouseMsg){// 单击左键if (IDR_MAINFRAME == uID){if (IsIconic()) // 是否最小化(图标化)窗口{ShowWindow(SW_NORMAL);}}}else if (WM_RBUTTONDOWN == uMouseMsg){// 单击右键if (IDR_MAINFRAME == uID){CMenu menu;menu.LoadMenu(IDR_TPMENU); // 加入图标右键快捷菜单SetForegroundWindow(); // 放置在前面CMenu* pMenu = menu.GetSubMenu(0); // 下拉菜单ASSERT(NULL != pMenu);POINT pt;GetCursorPos(&pt);pMenu->TrackPopupMenu( // 弹出快捷菜单TPM_RIGHTBUTTON | TPM_LEFTALIGN, pt.x, pt.y, this);pMenu->DestroyMenu();}}return TRUE;}5.在程序退出消息处理程序中执行托盘图标卸载过程// 添加消息映射BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)ON_COMMAND(ID_APP_EXIT, OnAppExit)END_MESSAGE_MAP()// 消息处理函数afx_msg void OnAppExit();void ExitNotifyIcon();void CMainFrame::OnAppExit(){ExitNotifyIcon();}void CMainFrame::ExitNotifyIcon(){NOTIFYICONDATA nifd;nifd.cbSize = sizeof(NOTIFYICONDATA);nifd.hWnd = m_hWnd;nifd.uID = IDR_MAINFRAME;Shell_NotifyIcon(NIM_DELETE, &nifd);AfxPostQuitMessage(0);}小结:1)学习理解NOTIFYICONDATA结构体中的成员变量2)Shell_NotifyIcon()的使用:安装/卸载3)IsIconic()的使用4)自定义消息映射/ID_APP_EXIT系统ID的应用PS:衣缘满室此链接与学习无关,纯粹GG。

MFC基于Dialog的托盘程序(Visual C++ 2013)

MFC基于Dialog的托盘程序(Visual C++ 2013)
MFC 基于 Dialog 的托盘程序
MFC 基于 DIALOG 的托盘程序......................................................................................................................................1
BOOL TrayMessage(HWND hWnd, DWORD dwMessage, HICON hIcon, LPCWSTR pszTip);
在执行文件 TrayDialog.cpp 中添加函数定义
BOOL TrayMessage(HWND hWnd, DWORD dwMessage, HICON hIcon, LPCWSTR pszTip) {
一、托盘是什么
所谓的“托盘”,在 Windows 系统界面中,指的就是下面任务条右侧,有系统时间等等的标志的那一部 分。在程序最小化或挂起时,但有不希望占据任务栏的时候,就可以把程序放到托盘区。
二、NOTIFYICODDATA 结构和 Shell_NotifyIcon 函数
1、 NOTIFYICONDATA 结构包含了系统用来处理托盘图标的信息,它包括选择的图标、回调消息、提 示消息和图标对应的窗口等内容。其定义为:
#define WM_TRAY_NOTIFICATION WM_USER+1
打开类向导,选择消息选项卡,打开添加自定义消息对话框,添加自定义消息;
Figure 1 添加自定义消息 这时头文件 TrayDialogDlg.h 中会自动添加声明
afx_msg LRESULT OnTrayNotification(WPARAM wParam, LPARAM lParam);

VC实现托盘程序

VC实现托盘程序

VC实现托盘程序
佚名
【期刊名称】《软件》
【年(卷),期】2005(000)007
【摘要】想必大家都了解在系统托盘(Tray)区中的程序,托盘区就是在 Windows
操作系统桌面上位于任务栏最右边的状态区,显示时间和一些小图标。

这些图标代
表着特定的功能或程序,当你用鼠标点击窗口最小化按钮,程序的窗口会关闭;图标显示在托盘区,然后再点击托盘区的图标,窗口会恢复。

这些图标使软件用起来很方便。

而且会让程序更具有专业水准。

本文通过一个实例来讲述如何用 VC 编程创建一个这样的托盘程序。

另外还想说一下,评估一个应用程序的好坏,界面是一个至关重要
的因素。

一个软件的界面是否有吸引力,是否易用,直接影响到用户的选择。

一般用
户可不管你程序里面是用哪一种算法,哪一种编码,如果功能差不多,速度稍微慢一点,但是界面吸引人,易用,用户绝对会乐意选择。

因此本文又讲解了一种设置程序界面
的方法,使界面美观大方,有吸引力。

【总页数】4页(P74-77)
【正文语种】中文
【相关文献】
1.用JavaSE 6.0 实现系统托盘程序 [J], 吴亚峰;苏亚光;张方放
2.在系统托盘中实现应用程序图标的动态显示 [J], 鲁礼炳
3.VC++6.0子用户界面线程及托盘的实现 [J], 张钟
4.VB环境下实现应用程序的系统托盘 [J], 阎红灿;刘自荣;刘凤春
5.Windows系统托盘程序的实现 [J], 王永梅
因版权原因,仅展示原文概要,查看原文内容请购买。

用C++Builder编写Tray程序

用C++Builder编写Tray程序
2
void __fastcall TForm1::WndProc(Messages::TMessage& Message) { if(Message.Msg==iconmessage) {
if(Message.LParam==WM—LBUTTONDBLCLK) { Application->Terminate(); //如果双击图标,则关闭应用程序 } return; } TForm::WndProc(Message);//对于其他的消息,调用基础类的WndProc函数让Wid ——fastcall TForm1::FormCreate(TObject *Sender) { iconmessage=RegisterWindowMessage(″IconNotify″); AddTrayIcon(); } 这里通过调用RegisterWindowMessage函数来定义一个用户消息,也可以通过WM_USER+n来获得一个系 统没有使用的消息编号。 void ——fastcall TForm1::FormDestroy(TObject *Sender) { RemoveTrayIcon(); //窗体在关闭时删除托盘中的图标
4
3
} 编写Timer1的Timer事件代码,当用户将鼠标停留在图标上时,显示提示文本: void ——fastcall TForm1::Timer1Timer(TObject *Sender) { NOTIFYICONDATA icondata; memset (&icondata, 0, sizeof (icondata)); icondata.cbSize = sizeof (icondata); icondata.hWnd = Handle; String s=″我的图标!″;//定义提示文本 strncpy (icondata.szTip, s.c_str(), sizeof (icondata.szTip)); icondata.uFlags = NIF—TIP ; Shell—NotifyIcon (NIM—MODIFY,&icondata); } 程序运行时不显示主窗体,只在托盘上放置相应的程序图标,从C++ Builder主选单中选择 View|Project Source,在WinMain函数的Application→Initialize()语句后增加代码: ShowWindow(Application→Handle,SW—HIDE); Application→ShowMainForm=false; 按F9编译并运行程序,托盘上就会出现相应的图标。以上代码在C++ Builder3、Pwin98环境下编译、 运行通过。

C++最小化托盘

C++最小化托盘

VC++中把一个对话框最小化到托盘一、托盘简介所谓的“托盘”,在Windows系统界面中,指的就是下面任务条右侧,有系统时间等等的标志的那一部分。

在程序最小化或挂起时,但有不希望占据任务栏的时候,就可以把程序放到托盘区。

二、托盘编程相关函数把程序放到托盘上的本质就是先在托盘区绘制一个图标,然后把程序隐藏不见,再对托盘的图标进行消息处理,就可以了。

绘制图标以及确定图标所传送消息的函数只有一个: WINSHELLAPI BOOL WINAPI Shell_NotifyIcon( DWORD dwMessage, PNOTIFYICONDATA pnid ); 这个函数,负责向系统传递消息,以添加、修改或删除托盘区的图标。

参数dwMessage 是表示这个函数的应用功能是哪一方面,是添加、删除,还是修改图标。

如果是添加,则它的值为NIM_ADD;删除则是NIM_DELETE;而修改是NIM_MODIFY。

参数pnid就是具体的和程序在托盘区的图标有关系的结构了。

它的定义如下:typedef struct _NOTIFYICONDATA { DWORD cbSize; HWND hWnd; UINT uID; UINT uFlags; UINT uCallbackMessage; HICON hIcon;char szTip[64]; } NOTIFYICONDATA,*PNOTIFYICONDATA; 下面就对该结构各个参数进行刨析:cbSize : 结构的长度,用“位”来做单位。

一般在程序中,我们用(DWORD)sizeof(NOTIFYICONDATA) 给它赋值。

HWnd : 一个句柄,如果对托盘中的图标进行操作,相应的消息就传给这个句柄所代表的窗口。

大多数情况下是this->m_hWnd。

uID : 在工程中定义的图标ID uFlags : 这个成员标志着其他哪些成员的数据是有效的,分别为NIF_ICON, NIF_MESSAGE, NIF_TIP,分别代表着数据有效的成员是hIcon, uCallbackMessage, szTip。

用VisualBasic编写托盘程序

用VisualBasic编写托盘程序

用VisualBasic编写托盘程序
崔佳宾
【期刊名称】《电子与电脑》
【年(卷),期】1998(5)9
【摘要】Windows 95、Windows 98、Windows NT等操作系统的界面上都增加了Shell层的技术,这就为广大编程人员开辟了界面编程的新途径。

本文讲述的是如何用VB 5.0来编写托盘程序。

托盘程序主要解决两个问题:(1)创建、修改、删除托盘;(2)如何对托盘接收到的消息进行处理。

这就要用到几个Win32 API。

首先,Shell_NotifyIcon是用于托盘的Shell API。

该API用到一个NOTIFYICONDATA结构,该结构包括:hIcon(托盘图标指针)。

【总页数】3页(P113-115)
【作者】崔佳宾
【作者单位】辽宁大连河口区凌北路11号管理推进室
【正文语种】中文
【中图分类】TP311
【相关文献】
1.如何用Delphi编写托盘程序 [J], 薛燕红
2.用VisualBasic编写控制程序方法 [J], 李晓辉;肖蓉晖
3.如何用Delphi编写托盘程序 [J], 薛燕红
4.VisualBasic在数控冲程序编写中的应用 [J],
5.使用PowerBuilder编写系统托盘程序 [J], 周伟;王丰
因版权原因,仅展示原文概要,查看原文内容请购买。

跟我学VS#语言编程技术——C#下实现动态系统托盘图标程序的应用示例

跟我学VS#语言编程技术——C#下实现动态系统托盘图标程序的应用示例

1.1跟我学VS#语言编程技术——C#下实现动态系统托盘图标程序的应用示例1.1.1C#下实现动态系统托盘图标程序的应用示例1、系统托盘图标程序所谓托盘程序顾名思义就是象托起的盘子一样的程序。

而所谓的托起的盘子就是程序运行中显示出的图标,而托起的位置就是视窗系统的的工具栏了。

托盘程序具有直观、占用屏幕空间较小并且可以为它定义多个功能菜单,这就给操作者带来了方便,所以越来越多的程序设计者都把程序设计成托盘这种方式。

它是指停放在任务栏上的图标程序(类似于Flashget、OICQ那种系统托盘图标)、并且一般在后台运行(如常见的病毒监视、媒体播放等程序)。

它们一般都具有单击显示或隐藏主界面,击右键弹出菜单,当鼠标停在图标上时显示提示信息的功能。

2、NotifyIcon控件Windows 窗体 NotifyIcon 组件通常用于显示在后台运行的进程的图标,它是WinForm组件中专门用来开发托盘程序的组件-这些进程大部分时间不显示用户界面。

如通过单击任务栏状态通知区域的图标来访问的病毒防护程序就是一个示例。

每个 NotifyIcon 组件在状态区域显示一个图标。

如果有三个后台进程并且希望为每个进程显示一个图标,则必须向窗体添加三个 NotifyIcon 组件。

NotifyIcon 组件的主要属性是 Icon 和 Visible。

其中Icon 属性设置显示在状态区域的图标。

为使图标显示,Visible 属性必须设置为true。

图标可以有关联的工具提示和上下文菜单。

3、程序设计中所应该考虑的主要的问题(1)如何在程序运行后隐藏窗体我们知道托盘程序运行后是无法看见主窗体的,他只会显示在工具栏上。

方法是重载主窗体中的OnActivated( )事件,OnActivated( )事件是在窗体激活的时候才触发的。

通过重载此事件可以达到隐藏主窗体的目的。

具体程序代码如下:private void Form1_Activated(object sender, System.EventArgs e){if(!this.showFlag) {this.Visible=false; //或者this.Hide();}}(2)如何为托盘程序设定显示图标在NotifyIcon组件中有一个属性icon就是来设定托盘图标的,通过下列语句来得到一个icon对象:private Icon mNetTrayIcon = new Icon ( "Tray.ico" ) ;请注意:在编译好的程序中,必须要在同一个目录中有一个Tray.ico图标文件,否则程序运行时候会出错的。

VC通过托盘图标得到该所属进程的实现代码

VC通过托盘图标得到该所属进程的实现代码

VC通过托盘图标得到该所属进程的实现代码⽬录代码⼀代码⼆代码三代码四代码五代码六本例以获取程序托盘图标位置为例//根据需要还可以获取不少信息代码⼀//获取托盘区域数据RECT CTray::GetTrayRect(){RECT rect = {0};HWND hWnd = NULL;hWnd = FindTrayWnd();if (hWnd != NULL){if (!EnumNotifyWindow(rect,hWnd))//如果没在普通托盘区{hWnd = FindNotifyIconOverflowWindow();//在溢出区(win7)if (hWnd != NULL){EnumNotifyWindow(rect,hWnd);}}}return rect;}//枚举获取托盘区域位置bool CTray::EnumNotifyWindow(RECT &rect,HWND hWnd){//RECT rect = {0};bool bSuc = false;unsigned long lngPID = 0;long ret = 0,lngButtons = 0;long lngHwndAdr = 0,lngHwnd = 0;//,lngTextAdr,lngButtonID;HANDLE hProcess = NULL;LPVOID lngAddress = NULL,lngRect = NULL;if (hWnd != NULL){ret = GetWindowThreadProcessId(hWnd, &lngPID);if(ret != 0 && lngPID != 0){hProcess = OpenProcess(PROCESS_ALL_ACCESS|PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE,0,lngPID);// if (hProcess != NULL){lngAddress = VirtualAllocEx(hProcess,0, 0x4096, MEM_COMMIT, PAGE_READWRITE);lngRect = VirtualAllocEx(hProcess,0,sizeof(RECT), MEM_COMMIT, PAGE_READWRITE);lngButtons = SendMessage(hWnd, TB_BUTTONCOUNT, 0, 0); //发送消息获取托盘button数量if (lngAddress != NULL && lngRect != NULL){for(int i=0 ;i< lngButtons;i++){RECT rc = {0};int j = i;ret = SendMessage(hWnd,TB_GETBUTTON,j,long(lngAddress));//发送消息获取托盘项数据起始地址ret = ReadProcessMemory(hProcess, LPVOID(long(lngAddress) + 12),&lngHwndAdr,4,0);if(ret != 0 && lngHwndAdr != -1){ret = ReadProcessMemory(hProcess, LPVOID(lngHwndAdr),&lngHwnd, 4,0);//获取句柄if(ret != 0 && (HWND)lngHwnd == m_NotifyIconData.hWnd)//{ret = ::SendMessage(hWnd,TB_GETITEMRECT,(WPARAM)j,(LPARAM)lngRect); //发送消息获取托盘项区域数据 ret = ReadProcessMemory(hProcess,lngRect,&rc, sizeof(rc),0); //读取托盘区域数据if(ret != 0){CWnd::FromHandle(hWnd)->ClientToScreen(&rc);rect = rc;}bSuc = true;//在普通托盘区找到,在溢出区不再查找break;}}}}if (lngAddress != NULL){VirtualFreeEx( hProcess, lngAddress, 0x4096, MEM_DECOMMIT);VirtualFreeEx( hProcess, lngAddress, 0, MEM_RELEASE);}if (lngRect != NULL){VirtualFreeEx( hProcess, lngRect, sizeof(RECT), MEM_DECOMMIT);VirtualFreeEx( hProcess, lngRect, 0, MEM_RELEASE);}CloseHandle(hProcess);}}}return bSuc;}//获取普通托盘区窗⼝句柄HWND CTray::FindTrayWnd(){HWND hWnd = NULL;HWND hWndPaper = NULL;if ((hWnd = FindWindow(_T("Shell_TrayWnd"), NULL)) != NULL){if ((hWnd = FindWindowEx(hWnd, 0, _T("TrayNotifyWnd"), NULL)) != NULL){hWndPaper = FindWindowEx(hWnd, 0, _T("SysPager"), NULL);if(!hWndPaper)hWnd = FindWindowEx(hWnd, 0, _T("ToolbarWindow32"), NULL);elsehWnd = FindWindowEx(hWndPaper, 0, _T("ToolbarWindow32"), NULL);}}return hWnd;}//获取溢出托盘区窗⼝句柄HWND CTray::FindNotifyIconOverflowWindow(){HWND hWnd = NULL;hWnd = FindWindow(_T("NotifyIconOverflowWindow"), NULL);if (hWnd != NULL){hWnd = FindWindowEx(hWnd, NULL, _T("ToolbarWindow32"), NULL);}return hWnd;}以下代码⽹上收集的,变量初始化指针句柄及函数是否成功都没判定//需要的⾃⼰加下判定,有时间再改了代码⼆struct TRAYDATA{HWND hwnd;UINT uID;UINT uCallbackMessage;DWORD Reserved[2];HICON hIcon;};void CTray::GetTrayRect(){HWND hWnd,hWndPaper;unsigned long lngPID;long ret,lngButtons;HANDLE hProcess;LPVOID lngAddress;long lngTextAdr,lngHwndAdr,lngHwnd,lngButtonID;TCHAR strBuff[1024]={0};TRAYDATA trayData = {0};TBBUTTON btnData={0};hWnd = FindWindow(_T("Shell_TrayWnd"), NULL);hWnd = FindWindowEx(hWnd, 0, _T("TrayNotifyWnd"), NULL);hWndPaper = FindWindowEx(hWnd, 0, _T("SysPager"), NULL);if(!hWndPaper)hWnd = FindWindowEx(hWnd, 0, _T("ToolbarWindow32"), NULL);elsehWnd = FindWindowEx(hWndPaper, 0, _T("ToolbarWindow32"), NULL);ret = GetWindowThreadProcessId(hWnd, &lngPID);hProcess = OpenProcess(PROCESS_ALL_ACCESS|PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE,0,lngPID); lngAddress = VirtualAllocEx(hProcess,0, 0x4096, MEM_COMMIT, PAGE_READWRITE);lngButtons = SendMessage(hWnd, TB_BUTTONCOUNT, 0, 0);RECT rc; POINT point;LPVOID lngRect = VirtualAllocEx(hProcess,0,sizeof(RECT), MEM_COMMIT, PAGE_READWRITE);CRect rect;for(int i=0 ;i< lngButtons;i++){int j = i;ret = SendMessage(hWnd,TB_GETBUTTON,j,long(lngAddress));ret = ReadProcessMemory(hProcess, LPVOID(long(lngAddress) + 16),&lngTextAdr,4,0);if(lngTextAdr != -1){ret = ReadProcessMemory(hProcess, LPVOID(lngTextAdr),strBuff,1024,0);//ret = ReadProcessMemory(hProcess, LPVOID(long(lngAddress) + 12),&lngHwndAdr,4,0); //获取句柄//ret = ReadProcessMemory(hProcess, LPVOID(lngHwndAdr),&lngHwnd, 4,0);//ret = ReadProcessMemory(hProcess, LPVOID(long(lngAddress) + 4),&lngButtonID,4,0);//获取buttonIDCString str(strBuff);if (pare(m_NotifyIconData.szTip) == 0){::SendMessage(hWnd,TB_GETITEMRECT,(WPARAM)j,(LPARAM)lngRect);ReadProcessMemory(hProcess,lngRect,&rc, sizeof(rc),0); //获取托盘图标区域CWnd::FromHandle(hWnd)->ClientToScreen(&rc);}//以下是隐藏托盘图标// {// if(show)// {// SendMessage(hWnd,TB_HIDEBUTTON,lngButtonID,0);// }// else// {// SendMessage(hWnd,TB_HIDEBUTTON,lngButtonID,1);// }// }}}VirtualFreeEx( hProcess, lngAddress, 0x4096, MEM_DECOMMIT);VirtualFreeEx( hProcess, lngAddress, 0, MEM_RELEASE);VirtualFreeEx( hProcess, lngRect, sizeof(RECT), MEM_DECOMMIT);VirtualFreeEx( hProcess, lngRect, 0, MEM_RELEASE);CloseHandle(hProcess);}代码三VOID StartStorm(){HWND hMain = FindWindow("animate_layered_window_class", "暴风媒体中⼼");if ( hMain ){ShowWindow(hMain, SW_HIDE);}//得到⼯具栏句柄HWND hTray = FindWindow("Shell_TrayWnd", NULL);hTray = FindWindowEx(hTray, 0, "TrayNotifyWnd", NULL);hTray = FindWindowEx(hTray, 0, "SysPager", NULL);hTray = FindWindowEx(hTray, 0, "ToolbarWindow32", NULL);//获取explore进程IDDWORD TrayPid;GetWindowThreadProcessId(hTray, &TrayPid);//打开进程并且开辟进程空间RECT rect;TBBUTTON tb;TBBUTTON pTb;LPVOID lpAddr;DWORD dwThreadIdOfICO;DWORD dwTempId = FindStorm("Stormtray.exe"); //你要点击的进程的PIDTRAYDATA traydata;HANDLE hOpen = OpenProcess(PROCESS_ALL_ACCESS, FALSE, TrayPid);lpAddr = VirtualAllocEx(hOpen, NULL, sizeof(tb) + sizeof(rect), MEM_COMMIT, PAGE_READWRITE);int nCount = SendMessage(hTray, TB_BUTTONCOUNT, 0, 0);int i;DWORD dwOutWrite;for ( i = 0; i < nCount; i ++){ZeroMemory(&tb, sizeof(tb));ZeroMemory(&rect, sizeof(rect));//把参数写进⽬标进程WriteProcessMemory(hOpen, lpAddr, &tb, sizeof(tb), &dwOutWrite);//WriteProcessMemory(hOpen, (LPVOID)((DWORD)lpAddr + sizeof(pTb)), &rect, sizeof(rect), &dwOutWrite);//获取BUTTONSendMessage(hTray, TB_GETBUTTON, i, LPARAM(lpAddr));//读取TBBUTTON结构ReadProcessMemory(hOpen, lpAddr, &pTb, sizeof(TBBUTTON), &dwOutWrite);//读取TRAYDATA结构ReadProcessMemory(hOpen, (LPVOID)pTb.dwData, &traydata, sizeof(TRAYDATA), &dwOutWrite);GetWindowThreadProcessId(traydata.hwnd, &dwThreadIdOfICO);if ( dwThreadIdOfICO == dwTempId ){//获取ICO的RECTLPVOID lp = (LPVOID)((DWORD)lpAddr + sizeof(pTb));SendMessage(hTray, TB_GETITEMRECT, i, (LPARAM)lp);LPVOID lpdata = (LPVOID)((DWORD)lpAddr + sizeof(TBBUTTON));ReadProcessMemory(hOpen, lpdata, &rect, sizeof(rect), &dwOutWrite);int iGap = rect.right/2; //得到图标的中间坐标的间隔//点击SendMessage(hTray, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(rect.right - iGap, rect.bottom - iGap));SendMessage(hTray, WM_LBUTTONUP, 0, MAKELPARAM(rect.right - iGap, rect.bottom - iGap));//CloseHandle(hOpen);break;;}}}win7有⼀个溢出托盘区:以下是隐藏在托盘区中的托盘信息,⽤以上的⽅法找不到,因为在NotifyIconOverflowWindow⾥Fhwnd = FindWindow("NotifyIconOverflowWindow", NULL)代码四#include "stdafx.h"#include <afx.h>#include <locale.h>#include <string>using namespace std;typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);BOOL IsWow64(){BOOL bIsWow64 = FALSE;LPFN_ISWOW64PROCESSfnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle(_T("kernel32")),"IsWow64Process");if (NULL != fnIsWow64Process){if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64)){// handle error}}return bIsWow64;}HWND FindTrayWnd(){HWND hWnd = NULL;hWnd = FindWindow(_T("Shell_TrayWnd"), NULL);hWnd = FindWindowEx(hWnd, NULL, _T("TrayNotifyWnd"), NULL);hWnd = FindWindowEx(hWnd, NULL, _T("SysPager"), NULL);hWnd = FindWindowEx(hWnd, NULL, _T("ToolbarWindow32"), NULL);return hWnd;}HWND FindNotifyIconOverflowWindow(){HWND hWnd = NULL;hWnd = FindWindow(_T("NotifyIconOverflowWindow"), NULL);hWnd = FindWindowEx(hWnd, NULL, _T("ToolbarWindow32"), NULL);return hWnd;}void EnumNotifyWindow(HWND hWnd){DWORD dwProcessId = 0;GetWindowThreadProcessId(hWnd,&dwProcessId);HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, dwProcessId); if ( hProcess==NULL ){return;}LPVOID lAddress = VirtualAllocEx(hProcess, 0, 4096, MEM_COMMIT, PAGE_READWRITE);if ( lAddress==NULL ){return;}DWORD lTextAdr = 0;BYTE buff[1024] = {0};CString strFilePath;CString strTile;HWND hMainWnd = NULL;int nDataOffset = sizeof(TBBUTTON) - sizeof(INT_PTR) - sizeof(DWORD_PTR);int nStrOffset = 18;if ( IsWow64() ){nDataOffset+=4;nStrOffset+=6;}//得到圖標個數int lButton = SendMessage(hWnd, TB_BUTTONCOUNT, 0, 0);for (int i = 0; i < lButton; i++) {SendMessage(hWnd, TB_GETBUTTON, i, (LPARAM)lAddress);//讀⽂本地址ReadProcessMemory(hProcess, (LPVOID)((DWORD)lAddress + nDataOffset), &lTextAdr, 4, 0);if ( lTextAdr!=-1 ) {//讀⽂本ReadProcessMemory(hProcess, (LPCVOID)lTextAdr, buff, 1024, 0);hMainWnd = (HWND)(*((DWORD*)buff));strFilePath = (WCHAR *)buff + nStrOffset;strTile = (WCHAR *)buff + nStrOffset + MAX_PATH;_tprintf(_T("%s %s\n"),strTile,strFilePath);}}VirtualFreeEx(hProcess, lAddress, 4096, MEM_RELEASE);CloseHandle(hProcess);}int _tmain(int argc, _TCHAR* argv[]){setlocale(LC_ALL, "chs");EnumNotifyWindow(FindTrayWnd());_tprintf(_T("\n"));EnumNotifyWindow(FindNotifyIconOverflowWindow());system("pause");return 0;}代码五void CTrayDlg::OnButton1(){// TODO: Add your control notification handler code hereHWND wd=::FindWindow("Shell_TrayWnd",NULL);if (wd==NULL){MessageBox("Error1");return;}HWND wtd=FindWindowEx(wd,NULL,"TrayNotifyWnd",NULL);if (wtd==NULL){MessageBox("Error2");return;}HWND wd1=FindWindowEx(wtd,NULL,"ToolbarWindow32",NULL);if (wd1==NULL){MessageBox("Error3");return;}DWORD pid;pid=0;GetWindowThreadProcessId(wd1,&pid);if (pid==NULL){MessageBox("Error4");return;}HANDLE hd=OpenProcess(PROCESS_QUERY_INFORMATION ¦ PROCESS_ALL_ACCESS ,true,pid); if (hd==NULL){MessageBox("Error6");return;}int num=::SendMessage(wd1,TB_BUTTONCOUNT ,NULL,NULL);int i;unsigned long n;TBBUTTON p,*pp;CString x;wchar_t name[256];unsigned long whd,proid;CString temp;TBBUTTON *sp;sp= (TBBUTTON *)0x20f00; //这⾥应该改成⽤VirtualAllocEx分配内存否则有可能出错,不过⼈懒,就先这么着吧for(i=0;i<num;i++){::SendMessage(wd1,TB_GETBUTTON,i,(LPARAM)sp);pp=&p;ReadProcessMemory(hd,sp,pp,sizeof(p),&n);// x.Format("%x %x %x %x %x %x",p.iBitmap,p.idCommand,p.fsState,p.fsStyle, p.dwData, p.iString); name[0]=0;if (p.iString!=0xffffffff){try{ReadProcessMemory(hd,(void *)p.iString,name,255,&n);name[n]=0;}catch(){}// x+=" ";// x+=name;temp=name;try{whd=0;ReadProcessMemory(hd,(void *)p.dwData,&whd,4,&n);}catch(){}proid=0;GetWindowThreadProcessId((HWND)whd,&proid);x.Format("位置=%d 名称=%s 窗⼝句柄=%08x 进程ID=%08x",i,(LPCTSTR )temp,whd,proid);m_list.AddString(x);}}}代码六void CTrayDlg::OnButton1(){// TODO: Add your control notification handler code hereHWND wd=::FindWindow("Shell_TrayWnd",NULL);if (wd==NULL){MessageBox("Error1");return;}HWND wtd=FindWindowEx(wd,NULL,"TrayNotifyWnd",NULL);if (wtd==NULL){MessageBox("Error2");return;}HWND wd1=FindWindowEx(wtd,NULL,"ToolbarWindow32",NULL);if (wd1==NULL){MessageBox("Error3");return;}DWORD pid;pid=0;GetWindowThreadProcessId(wd1,&pid);if (pid==NULL){MessageBox("Error4");return;}HANDLE hd=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_ALL_ACCESS ,true,pid); if (hd==NULL){MessageBox("Error6");return;}int num=::SendMessage(wd1,TB_BUTTONCOUNT ,NULL,NULL);int i;unsigned long n;TBBUTTON p,*pp;CString x;wchar_t name[256];unsigned long whd,proid;CString temp;TBBUTTON *sp;sp= (TBBUTTON *)0x20f00;for(i=0;i<num;i++){::SendMessage(wd1,TB_GETBUTTON,i,(LPARAM)sp);pp=&p;ReadProcessMemory(hd,sp,pp,sizeof(p),&n);// x.Format("%x %x %x %x %x %x",p.iBitmap,p.idCommand,p.fsState,p.fsStyle, p.dwData, p.iString);name[0]=0;if (p.iString!=0xffffffff){try{ReadProcessMemory(hd,(void *)p.iString,name,255,&n);name[n]=0;}catch(...){}// x+=" ";// x+=name;temp=name;try{whd=0;ReadProcessMemory(hd,(void *)p.dwData,&whd,4,&n);}catch(...){}proid=0;GetWindowThreadProcessId((HWND)whd,&proid);x.Format("位置=%d 名称=%s 窗⼝句柄=%08x 进程ID=%08x",i,(LPCTSTR )temp,whd,proid);m_list.AddString(x);}}}到此这篇关于VC通过托盘图标得到该所属进程的实现代码的⽂章就介绍到这了,更多相关VC托盘图标得到该所属进程内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。

如何用VISUAL BASIC编写托盘程序

如何用VISUAL  BASIC编写托盘程序
收辅 日期:2 0 - -l 0 1 6I 0
ScI oi I n的函数声明 h lN tyc - f o
作者越舟t李夭明 (96),男 .甘肃甘谷人,夭求市委党校讲师 I6. 3 9
维普资讯
D cae F n t n S el t Io i e lr u ci h lNo c n Lb” S el2dl Al s “ o - h l .l” 3 i a
中田分类号:T 33 P 9 文献标 识码:B 文章 编号: 17-3 12 0 )2 0 90 3 115 (0 20 - 3 -3 0
l托盘程序 的慨 念及在VB中编写 的原 则
在Wid w 桌面上的任务栏里,右下角有 许多应用程序 no s 目标 ,如 系统时钟 、输 入法 、计 划任务等 。而 程序本身 的 窗 口是 隐藏的 ,若你 要调用应用 程序 的窗 口,则双击 该 图 标 即可 ,这种程序称为托 盘程序 。
c Sz Dn b ieAsL g h dA L wn s D唱
u D A Lo g l s n
u lg s L Fa sA Dr
u l a k  ̄ sg Cal c M b a eAs o g L n
H dA L n wu s o g’接受托盘 图标消息的窗口指针 uDAs o g’由程序定 义的图标识别符 。因为有的程 l n L 序有多个图标 u g s m ’对 托盘 图标操作 的标志,包括添加 、 Ras A 修改,删除 u al cMc g As og’标志应 用程序 的消息 C l ak  ̄ c L n b hcnA L n Io s o g’托盘 图标指针 sTpA  ̄n *4’当 鼠标 指到托盘 图标时提 示字符 z i s ' g6 Si
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

托盘编程
一、托盘简介
所谓的“托盘”,在Windows系统界面中,指的就是下面任务条右侧,有系统时间等等的标志的那一部分。

在程序最小化或挂起时,但有不希望占据任务栏的时候,就可以把程序放到托盘区。

其实,托盘区的编程很简单,下面简要阐述一下子喽^_^
二、托盘编程相关函数
其实呢,把程序放到托盘上的本质就是先在托盘区绘制一个图标,然后把程序隐藏不见,再对托盘的图标进行消息处理,就可以了。

绘制图标以及确定图标所传送消息的函数只有一个,那就是——————
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA pnid
);
这个函数呢,负责向系统传递消息,以添加、修改或删除托盘区的图标。

她的返回值呢,是个布尔类型的。

就是说,如果返回0,那就是成仁啦,非0才成功。

参数dwMessage 是表示这个函数的应用功能是哪一方面,是添加、删除,还是修改图标。

如果是添加,则它的值为NIM_ADD;删除则是NIM_DELETE;而修改是NIM_MODIFY。

参数pnid就是具体的和程序在托盘区的图标有关系的结构了。

它的定义如下:
typedef struct _NOTIFYICONDATA {
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
char szTip[64];
} NOTIFYICONDATA, *PNOTIFYICONDATA;
下面就对该结构各个参数进行刨析:
cbSize : 结构的长度,用“位”来做单位。

一般在程序中,我们用(DWORD)sizeof(NOTIFYICONDATA) 给它赋值。

HWnd : 一个句柄,如果对托盘中的图标进行操作,相应的消息就传给这个句柄所代表的窗口。

自然了,大多数情况下是this->m_hWnd喽。

uID : 在工程中定义的图标ID
uFlags : 这个成员标志着其他哪些成员的数据是有效的,分别为NIF_ICON, NIF_MESSAGE, NIF_TIP,分别代表着数据有效的成员是hIcon, uCallbackMessage, szTip。

当然,三个值可以用“|”联系到一起。

下面分别对涉及到的成员进行阐述
hIcon : 要增加,删除或修改的图标句柄。

如果只知道个uID, 一般可能会用函数LoadIcon 来得到句柄。

例如LoadIcon ( AfxGetInstanceHandle() ,MAKEINTRESOURCE (IDR_MAINFRAME) )。

uCallbackMessage : 这在对托盘区的操作中,是比较重要的数据成员。

这是个消息标志,当用鼠标对托盘区相应图标进行操作的时候,就会传递消息给Hwnd所代表的窗口。

所以说,在uFlags 中,一般都得标志它有效。

这里一般都是自定义的消息。

szTip : 鼠标移动到托盘图标上时的提示文字。

三、托盘编程例子
有关托盘编程的基础知识呢,也就上面这些了。

下面呢,我们就进入具体的实战演练阶段,举几个托盘编程的例子瞧瞧,加深理解。

1、将程序最小化到系统托盘区的函数toTray()。

void CTimeWakeDlg::toTray()
{
NOTIFYICONDATA nid;
nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);
nid.hWnd=this->m_hWnd;
nid.uID=IDR_MAINFRAME;
nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;
nid.uCallbackMessage=WM_SHOWTASK;//自定义的消息名称
nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(nid.szTip,"计划任务提醒");//信息提示条为“计划任务提醒”
Shell_NotifyIcon(NIM_ADD,&nid);//在托盘区添加图标
ShowWindow(SW_HIDE);//隐藏主窗口
}
这是个很简单的函数,里面首先给NOTIFYICONDATA赋值,然后调用shell_NotifyIcon, 头一
个参数是NIM_ADD,表示添加。

然后用函数ShowWindow 隐藏主窗口,这样,就实现了将程序最小化到系统托盘区的任务了。

2、程序已经最小化到托盘区了,但是呢,对托盘图标的操作如何进行呢?这就体现了结构NOTIFYICONDATA的成员uCallbackMessage 的作用了。

它所提供的作用就是,当用户用鼠标点击托盘区的图标的时候(无论是左键还是右键),会向hWnd所代表的窗口传送消息,如果是上例,消息的名称就是WM_SHOWTASK。

根据VC的消息机制,对自定义消息增加消息响应函数。

在头文件的//{{AFX_MSG和//}}AFX_MSG之间声明消息响应函数:
afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM lParam);
然后在CPP文件中添加消息映射。

在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP 之间加入:
ON_MESSAGE(WM_SHOWTASK,onShowTask)将消息和消息响应函数映射起来。

然后就是在CPP文件中加入函数onShowTask的实现了:
LRESULT CTimeWakeDlg::onShowTask(WPARAM wParam,LPARAM lParam)
//wParam接收的是图标的ID,而lParam接收的是鼠标的行为
{
if(wParam!=IDR_MAINFRAME)
return 1;
switch(lParam)
{
case WM_RBUTTONUP://右键起来时弹出快捷菜单,这里只有一个“关闭”
{
LPPOINT lpoint=new tagPOINT;
::GetCursorPos(lpoint);//得到鼠标位置
CMenu menu;
menu.CreatePopupMenu();//声明一个弹出式菜单
//增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已
//隐藏),将程序结束。

menu.AppendMenu(MF_STRING,WM_DESTROY,"关闭");
//确定弹出式菜单的位置
menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);
//资源回收
HMENU hmenu=menu.Detach();
menu.DestroyMenu();
delete lpoint;
}
break;
case WM_LBUTTONDBLCLK://双击左键的处理
{
this->ShowWindow(SW_SHOW);//简单的显示主窗口完事儿}
break;
}
return 0;
}。

相关文档
最新文档