如何把windows任务栏上的程序隐藏到托盘图标中

bj_leo_2000 2002-03-25 04:57:56
如何把windows任务栏上的程序隐藏到托盘图标中,只能看到托盘图标看不到windows任务栏上的程序。我在工程文件里try之前用了ShowWindow(Application->Handle,SW_HIDE);可无效
...全文
994 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
comefirst 2002-03-25
  • 打赏
  • 举报
回复
首先,请看看这些术语。系统托盘是一个在任务条右角的小方框,在托盘了应用程序可以显示小图标。任务条是可以在屏幕上伸展的工具栏。它就是程序图标所在的位置。想隐藏程序的任务条图标,你可以应用ShowWindow函数并传给它Application->Handle窗口句柄。

ShowWindow(Application->Handle, SW_HIDE);
若想让任务条图标再出现,只需将SW_HIDE改为SW_SHOW。

ShowWindow(Application->Handle, SW_SHOW);
注: 你可以设置主窗口的Visible属性为false来隐藏它。

注: 通过ShowWindow来隐藏窗口的任务条图标是不持久的。某些动作会使任务条图标重现。你可以将隐藏的应用程序窗口设为Tool Window来移走程序的任务条图标而避免它再次出现。Tool windows永远不会有任务条图标。 使应用程序窗口成为一个Tool Window有一个副作用:当用户按下Alt-TAB时它将不在程序列表中出现。你可以调用API函数GetWindowLong和SetWindowLong来使应用程序窗口成为一个Tool Window。

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{

DWORD dwExStyle = GetWindowLong(Application->Handle, GWL_EXSTYLE);
dwExStyle |= WS_EX_TOOLWINDOW;
SetWindowLong(Application->Handle, GWL_EXSTYLE, dwExStyle);

try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
bj_leo_2000 2002-03-25
  • 打赏
  • 举报
回复
多谢大家!给分了!
NowCan 2002-03-25
  • 打赏
  • 举报
回复
DWORD dwExStyle = GetWindowLong(Application->Handle, GWL_EXSTYLE);
dwExStyle |= WS_EX_TOOLWINDOW;
SetWindowLong(Application->Handle, GWL_EXSTYLE, dwExStyle);

这个不知是否合你要求
bj_leo_2000 2002-03-25
  • 打赏
  • 举报
回复
托盘图标我会加,我是想知道怎样让工程在任务栏中消失。就是开始旁边的那一条
大大怪老张 2002-03-25
  • 打赏
  • 举报
回复
给分好了
大大怪老张 2002-03-25
  • 打赏
  • 举报
回复
给分吧
kingcaiyao 2002-03-25
  • 打赏
  • 举报
回复
Shell_NotifyIcon来实现就可以了。
marcal 2002-03-25
  • 打赏
  • 举报
回复
可以看例程D:\program files\Borland\CBuilder5\Examples\Controls\Traydemo

用C++ Builder编写Tray程序
周新栋

  Tray(托盘)是Windows9x任务条上的一个特殊区域,它的技术名称为“任务栏布告区”,一些软件(如金山词霸Ⅲ)运行时会在托盘上放置一个图标,使用户一眼就能知道这个程序正在后台运行,要想激活它也很容易,通常只需单击一下这个图标即可,非常方便。

  Tray的编程比较特殊,但并不难,主要包括图标、工具提示和消息等三个方面,它是Shell编程的一部分。ShellAPI提供了Shell—NotifyIcon函数,用它可以增加、删除或者修改托盘中的图标,在托盘上放置图标后,Windows Shell会负责把发生在图标上的鼠标事件通知应用程序。Shell—NotifyIcon函数定义如下:

  WINSHELLAPI BOOL WINAPI Shell—NotifyIcon(DWORD dwMessage,PNOTIFYICONDATA pnid);

  dwMessage表示要完成的操作:NIM—ADD(增加图标)、NIM—DELETE(删除图标)、NIM—MODIFY(修改图标或提示文本),pnid是一个指向NOTIFYICONDATA结构的指针,结构的定义如下:

  typedef struct —NOTIFYICONDATA{

  DWORD cbSize;//结构所占的字节数,必须用结构的大小来初始化。

  HWND hWnd;//接受Tray图标消息的窗口句柄

  UINT uID;//由应用程序定义的图标ID

  UINT uFlags;//用来鉴别那些需要改变其值的域,NIF_ICON表示hIcon有效,可用来修改图标,NIF_MESSAGE表示uCallbackMessage有效,用来定义消息,NIF—TIP表示szTip参数有效,可修改工具提示。

  UINT uCallbackMessage;//应用程序定义的消息

  HICON hIcon;//Tray图标的句柄

  char szTip[64];//工具提示的文本

  }NOTIFYICONDATA;

  下面我们就通过一个具体例子来说明实现方法,程序运行时不会显示主窗体,只在托盘上增加一个图标,双击图标可关闭程序。

  程序运行时托盘区显示如下:

  新建一个工程,放置一个Timer控件到窗体上。打开unit1.h文件,增加头文件说明#include <shellapi.h>,在TForm1定义的private段增加一些数据成员和方法的声明:

  unsigned int iconmessage;//定义的消息

  void AddTrayIcon();//在托盘上增加图标

  void RemoveTrayIcon();//从托盘中删除图标

  由于要增加对自定义消息的处理,所以必须重载窗口过程函数WndProc,在TForm1的定义中增加protected段:virtual void __fastcall WndProc(Messages::Tmessage& Message);

//为系统增加几个函数

  在unit1.cpp中定义相应的成员函数:

  void TForm1::AddTrayIcon() //增加图标

  {

  NOTIFYICONDATA icondata;

  memset(&icondata,0,sizeof(icondata));

  //将结构icondata的各域初始化为0

  icondata.cbSize=sizeof(icondata);

  icondata.hWnd=Handle;

  strncpy(icondata.szTip,″未知状态″,sizeof(icondata.szTip));

  icondata.hIcon=Application->Icon->Handle;

  icondata.uCallbackMessage=iconmessage;

  icondata.uFlags=NIF—MESSAGE|NIF—ICON|NIF—TIP;

  Shell—NotifyIcon(NIM—ADD,&icondata);

  }

  void TForm1::RemoveTrayIcon() //删除图标

  {

  NOTIFYICONDATA icondata;

  memset(&icondata,0,sizeof(icondata));

  icondata.cbSize=sizeof(icondata);

  icondata.hWnd=Handle;

  Shell—NotifyIcon(NIM—DELETE,&icondata);

  }

  重载TForm1的WndProc函数,加入对自定义消息的处理代码,这其实相当于创建了TForm类的子类。

  void __fastcall TForm1::WndProc(Messages::TMessage& Message) //

  {

  if(Message.Msg==iconmessage)

  {

   if(Message.LParam==WM—LBUTTONDBLCLK)

   {

   Application->Terminate();

  //如果双击图标,则关闭应用程序

   }

   return;

  }

  TForm::WndProc(Message);//对于其他的消息,调用基础类的WndProc函数让Windows进行缺省处理。

  }

  创建窗体的OnCreate事件句柄:

  void ——fastcall TForm1::FormCreate(TObject *Sender) //在窗体建立时候的动作

  {

  iconmessage=RegisterWindowMessage(″IconNotify″);

  AddTrayIcon();//调用在系统栏建立图标的函数

  }

  这里通过调用RegisterWindowMessage函数来定义一个用户消息,也可以通过WM_USER+n来获得一个系统没有使用的消息编号。

void ——fastcall TForm1::FormDestroy(TObject *Sender) //在窗口结束的时候结束窗口,现在没有了这个事件,是不是应该用FormClose

  {

  RemoveTrayIcon();   //窗体在关闭时删除托盘中的图标

  }

  //编写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环境下编译、运行通过。







回复贴子:
回复人: HEROIN(HEROIN) (2001-9-29 13:25:33) 得0分
在Sample面板上,有个TrayIcon控件...
回复人: xzJohn(雪人) (2001-9-29 13:28:58) 得0分
见CB5目录下的Examples\Apps\trayicon\trayicon.bpr
回复人: cul(恐龙++) (2001-9-29 13:59:59) 得0分
在搜索页面找“最小化”有一堆。
回复人: dycdyc123(谢谢帮助!) (2001-9-29 14:44:27) 得0分
给篇文章;

Windows95的任务条(Taskbar)上有一个状态区,可以显示当前输入法(中文版)、当前时间等信息,当启动打印管理器时还可显示打印管理器的图标,表明打印机正在工作。我们可以使用这一技术为正在后台工作的程序设置一个图标,以显示它的工作状态,用户可以通过鼠标点击来查询详细情况或修改工作参数。下面对其实现方法作一介绍。

图标的添加和删除

实现这两个操作都是通过调用Shell_NotifyIcon函数,并传递两个参数:一个是操作指示,添加时为NIM_ADD,删除时为NIM_DELETE;另一个是结构NOTIFYCONDATA,并需适当的初始化。通过指定不同的图标标识号,可以添加多个图标。下面的两个函数分别实现添加图标和移去图标。


//AddTaskBarICON:将指定图标添加到TaskBar的状态区,成功返回TRUE,否则返回FALSE
//hwnd:指定接收消息的窗口


//uID:图标的标识号


//hicon:待添加的图标句柄


//IpszTip:当鼠标停留在图标上时显示的提示信息


BOOL AddTaskBarICON(HWND hwnd,UINT uID,HICON hicon,LPSTR lpszTip)
{
BOOL res;
NOTIFYICONDATA tnid;
tnid.cbSize=sizeof(NOTIFYICONDATA);
tnid.hWnd=hwnd;
tnid.uID=uID;
tnid.uFlags=NIF_MESSAGE¦NIF_ICON¦NIF_TIP;

//用户点击图标时传给指定窗口的回调函数的消息,由程序员自定义
tnid.uCallbackMessage=MYWM_NOTIFYICON;
tnid.hIcon=hicon;
if (lpszTip)
lstrcpyn(tnid.szTip,lpszTip,sizeof(tnid.szTip));
else
tnid.szTip[0]=‘\0''

//NIM_ADD:添加图标
res=Shell_NotifyIcon(NIM_ADD,&tnid);

if(hicon)
DestroyIcon(hicon);

return res;

}


//DeleteTaskBarIcon:移去AddTaskBar的状态区上的指定图标,成功则返回TRUE,否则返回FALSE


//hwnd:添加图标时指定的窗口


//uID:要删除的图标标识号


BOOL DeleteTaskBarIcon(HWDN hwnd,UITN uID)
{
BOOL res;
NOTIFYICONDATA tnid;

tnid.cbSize=sizeof(NOTIFYICONDATA);
tnid.hWnd=hwnd;
tnid.uID=uID;

//NIM_DELETE:移去图标
res=Shell_NotifyIcon(NIM_DELETE,&tnid);

return res;

}


接收图标返回的消息
_________________________________

状态区的图标可以接收用户的输入,将接收到的鼠标消息传送到指定窗口的回调函数,程序可以对用户的输入做出相应的反应。下面是对应的窗口回调函数和消息处理函数的例子:


//MainWndProc:窗口回调函数,处理传递给窗口的消息

//Windows根据在添加图标时指定的窗口句柄确定对应的回调函数

LRESULT CALLBACK MainWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lP
aram){



switch(message){



//MYWM_NOTIFYICON:添加图标时指定的消息



case MYWM_NOTIFYICON:



//调用自定义的消息处理函数



ON_MYWM_NOTIFYICON(wParam,lParam);



break;



……



case WM_DESTROY:



PostQuitMessage(0);



break;



default:



return(DefWindowsProc(hwnd,message,wParam,lParam));



}



return lParam;



}



//On_MYWM_NOTIFYICON:处理TaskBar的状态区图标产生的消息

marcal 2002-03-25
  • 打赏
  • 举报
回复
可以看例程D:\program files\Borland\CBuilder5\Examples\Controls\Traydemo

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧