下面以一個具體的例子,詳細介紹一下利用Delphi實現系統狀態欄圖標的步驟和方法。 1.創建一個應用程序,在主窗體上增加一個TpopupMenu組件。并為該彈出選單組件增加選單項Exit,標題為“退出”! 2.在Uses中添加ShellAPI,因為在系統狀態欄中增加圖標時需調用ShellAPI中的函數Shell_NotifyIconA。該函數需要兩個參數,其中一個是TnotifyIconDataA結構,需在主窗體中增加TnotifyIconDataA類型的全局變量ntida。 3.定義消息mousemsg,并編寫主窗體的mousemessage消息處理函數,此函數說明在圖標上用鼠標左鍵單擊時,會打開應用程序窗口;用鼠標右鍵單擊時,會彈出一個選單! 下面給出步驟2和3的實現代碼: unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Menus, shellapi; const mousemsg = wm_user + 1; //自定義消息,用于處理用戶在圖標上點擊鼠標的事件 iid = 100; //用戶自定義數值,在TnotifyIconDataA類型全局變量ntida中使用 type TForm1 = class(TForm) ...... private //自定義消息處理函數,處理鼠標點擊圖標事件 procedure mousemessage(var message: tmessage); message mousemsg; public { Public declarations } end; var Form1: TForm1; ntida: TNotifyIcondataA; //用于增加和刪除系統狀態圖標 implementation {$R .DFM} procedure TForm1.mousemessage(var message: tmessage); var mousept: TPoint; //鼠標點擊位置 begin inherited; if message.LParam = wm_rbuttonup then begin //用鼠標右鍵點擊圖標 getcursorpos(mousept); //獲取光標位置 popupmenu1.popup(mousept.x, mousept.y); //在光標位置彈出選單 end; if message.LParam = wm_lbuttonup then begin //用鼠標左鍵點擊圖標 //顯示應用程序窗口 ShowWindow(Handle, SW_SHOW); //在任務欄上顯示應用程序窗口 ShowWindow(Application.handle, SW_SHOW); SetWindowLong(Application.Handle, GWL_EXSTYLE, not (GetWindowLong(Application.handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW AND NOT WS_EX_APPWINDOW)); end; message.Result := 0; end 5.編寫Tform1.OnClose的代碼如下: procedure TForm1.FormClose(Sender:TObject; var Action: TCloseAction); begin Action := caNone; //不對窗體進行任何操作 ShowWindow(Handle, SW_HIDE); //隱藏主窗體 //隱藏應用程序窗口在任務欄上的顯示 ShowWindow(Application.Handle, SW_HIDE); SetWindowLong(Application.Handle, GWL_EXSTYLE, GetWindowLong(Application.handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW AND NOT WS_EX _APPWINDOW); end; procedure TForm1.FormClose(Sender:TObject; var Action: TCloseAction); begin Action := caNone; //不對窗體進行任何操作 ShowWindow(Handle, SW_HIDE); //隱藏主窗體 //隱藏應用程序窗口在任務欄上的顯示 ShowWindow(Application.Handle, SW_HIDE); SetWindowLong(Application.Handle, GWL_EXSTYLE, GetWindowLong(Application.handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW AND NOT WS_EX _APPWINDOW); end; 6.編寫Exit代碼如下: 當用戶點擊Exit時實現完全退出應用程序。具體代碼如下: procedure TForm1.ExitClick(Sender:TObject); begin //為ntida賦值,指定各項參數 ntida.cbSize := sizeof(tnotifyicondataa); ntida.wnd := handle; ntida.uID := iid; ntida.uFlags := nif_icon + nif_tip + nif_message; ntida.uCallbackMessage := mousemsg; ntida.hIcon := Application.Icon.handle; ntida.szTip := 'Icon'; shell_notifyicona(NIM_DELETE, @ntida); //刪除已有的應用程序圖標 Application.Terminate; //中斷應用程序運行,退出應用程序 end 通過以上步驟,我們即可用Delphi輕松實現系統狀態欄圖標。
|