如何在視窗工作列實現trayico的功能 |
尚未結案
|
sam_000
一般會員 ![]() ![]() 發表:27 回覆:47 積分:14 註冊:2003-09-15 發送簡訊給我 |
|
seaturn99
版主 ![]() ![]() ![]() ![]() 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
sam_000 您好 : 站內討論 :
http://delphi.ktop.com.tw/topic.php?topic_id=55498
http://delphi.ktop.com.tw/topic.php?topic_id=47817
http://delphi.ktop.com.tw/topic.php?topic_id=32195 請至 http://www.scalabium.com 下載 Freeware SMComponent library 使用TSMTrayIcon ,非常簡單好用 Freeware ,附 Source ----
我只會兩件事,這也不會,那也不會 眼見不一定為真
---- 發表人 - SouthWind 於 2004/11/18 12:04:28
|
sam_000
一般會員 ![]() ![]() 發表:27 回覆:47 積分:14 註冊:2003-09-15 發送簡訊給我 |
|
seaturn99
版主 ![]() ![]() ![]() ![]() 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
引言: 版主提供的站內討論,看了許久,功能與trayicon元件提供的類似(不知我有沒弄錯) 但如果要達到在視窗工作列(非視窗工作列的狀態區status)能有pop彈出式功能或是滑鼠事件的運用,我的想法可能要能夠偵測到視窗工作列的相關事件 請問版主如何能偵測到視窗工作列的事件? samsam_000 您好 : 抱歉,是我弄錯您的意思了,Hook 所有的訊息,也許是一可行的方法,不過工程太浩大了,我直覺會去尋找 Shell 提供的 API,以及 taskbar 提供的 COM Interface 看是否能夠找到作法 ... Windows Shell Programming 也是自成一家的技巧,較少涉略,找到以下網路參考文件,祈能給您一點開始的線索... http://www.howtodothings.com/showarticle.asp?article=612 http://www.swissdelphicenter.ch/torry/showcode.php?id=1240 ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ---- |
Zard
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:24 回覆:396 積分:539 註冊:2003-11-26 發送簡訊給我 |
在視窗工作列加入自己的選單是可行的, 不過你的選單必須依存在系統選單下,因為系統選單你想刪也刪不掉(我試過用DeleteMenu, 不過其中一些選項無法刪除).剛才大略看了一下MSDN裡Shell Extention部份, 似乎也沒有能有效的解決這個問題的Interface可用(和工作列比較有關的有ITaskbarList,ITaskbarList兩個介面,有興趣可以看看). 這個小範例在執行起來後, 按下Button1就會在系統選單加入新選單, 用右鍵點選視窗工作列範例程式的Icon就可以看到結果了
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Menus; Const // 新選單的ID MENU_ID_TEST1 = 100; MENU_ID_TEST2 = 101; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } Function HandleSysCmd(var msg: TMessage): Boolean; end; var Form1: TForm1; implementation {$R *.DFM} Function TForm1.HandleSysCmd(var msg: TMessage): Boolean; begin if msg.Msg = WM_SYSCOMMAND then begin case msg.WParam of MENU_ID_TEST1: begin // 當Test1選單被按下時要做的事 ShowMessage('Test1'); end; MENU_ID_TEST2: begin // 當Test2選單被按下時要做的事 ShowMessage('Test2'); end; end; end; Result := FALSE; end; procedure TForm1.Button1Click(Sender: TObject); var hSysMenu: HMENU; begin // 在系統選單插入新選單 hSysMenu := GetSystemMenu(Application.Handle, FALSE); // 加入新分隔線 AppendMenu(hSysMenu, MF_SEPARATOR, 0, nil); // 加入新選單Test1 AppendMenu(hSysMenu, MF_STRING, MENU_ID_TEST1, 'Test1'); // 加入新選單Test2 AppendMenu(hSysMenu, MF_STRING, MENU_ID_TEST2, 'Test2'); Application.HookMainWindow(HandleSysCmd); end; end. |
sam_000
一般會員 ![]() ![]() 發表:27 回覆:47 積分:14 註冊:2003-09-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |