现在的位置: 首页 > 综合 > 正文

将应用程序最小化到任务栏

2018年04月07日 ⁄ 综合 ⁄ 共 2038字 ⁄ 字号 评论关闭

    最近写了个小程序,用到了将应用程序最小化到任务栏的技巧(陈年老技巧了),怕以后不记得了,贴出来与大家分享。

 

    具体原理不说了,就是Windows API.

 

 

  1. unit fMain;
  2. interface
  3. uses
  4.   // 记得要有 Windows, Messages,ShellAPI;
  5. const
  6.   WM_BARICON=WM_USER + 200;
  7. type
  8.   TfrmMain = class(TForm)
  9.     MainMenu1: TMainMenu;
  10.     PopupMenu1: TPopupMenu;
  11.   private
  12.     { Private declarations }
  13.     procedure RestoreWindow;
  14.     procedure WMSysCommand(var Message: TMessage); message WM_SYSCOMMAND;
  15.     procedure WMBarIcon(var Message:TMessage);message WM_BARICON;
  16.   public
  17.     { Public declarations }
  18.   end;
  19. var
  20.   frmMain: TfrmMain;
  21. implementation
  22. {$R *.dfm}
  23. procedure TfrmMain.WMBarIcon(var Message: TMessage);
  24. var 
  25.   p: TPoint;
  26. begin 
  27.   if (Message.LParam = WM_LBUTTONDOWN) then
  28.   begin
  29.     RestoreWindow;
  30.   end
  31.   else if (Message.LParam = WM_RBUTTONDOWN) then
  32.   begin
  33.     GetCursorPos(p);
  34.     PopupMenu1.Popup(p.X, p.Y);
  35.   end;
  36. end;
  37. procedure TfrmMain.WMSysCommand(var Message: TMessage);
  38. var
  39.   lpData: PNotifyIconData;
  40. begin 
  41.   if Message.WParam = SC_ICON then
  42.   begin
  43.     //如果用户最小化窗口则将窗口隐藏并在任务栏上添加图标
  44.     lpData := new(PNotifyIconDataA);
  45.     lpData.cbSize := 88;
  46.     //SizeOf(PNotifyIconDataA); 
  47.     lpData.Wnd := Self.Handle;
  48.     lpData.hIcon := Self.Icon.Handle;
  49.     lpData.uCallbackMessage := WM_BARICON;
  50.     lpData.uID :=0;
  51.     lpData.szTip := 'Samples'
  52.     lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
  53.     Shell_NotifyIcon(NIM_ADD,lpData);
  54.     dispose(lpData);
  55.     Self.Visible := False;
  56.   end
  57.   else
  58.   begin
  59.     //如果是其它的SystemCommand消息则调用系统缺省处理函数处理之。
  60.     DefWindowProc(Self.Handle,Message.Msg,Message.WParam,Message.LParam);
  61.   end;
  62. end;
  63. procedure TfrmMain.RestoreWindow;
  64. var
  65.   lpData:PNotifyIconData;
  66. begin
  67.   //如果用户点击任务栏图标则将图标删除并回复窗口。
  68.   lpData := new(PNotifyIconDataA);
  69.   lpData.cbSize := 88;//SizeOf(PNotifyIconDataA);
  70.   lpData.Wnd := Self.Handle;
  71.   lpData.hIcon := Self.Icon.Handle;
  72.   lpData.uCallbackMessage := WM_BARICON;
  73.   lpData.uID :=0;
  74.   lpData.szTip := '来电弹屏系统';
  75.   lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
  76.   Shell_NotifyIcon(NIM_DELETE,lpData);
  77.   dispose(lpData);
  78.   Self.Visible := True;
  79. end;
  80. end.

 

注意:主窗体一定要有图标,否则任务栏会有空白

当程序最小化到任务栏以后,点击右键,可以出现一个弹出式菜单,可以在里面增加一些处理的代码。

抱歉!评论已关闭.