有關 TrayIcon 的還原問題 |
答題得分者是:cat200188
|
P.D.
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
我寫了一個功能, 按下一個button, 將 exe 縮至 tray 中, 由tray中點選該 icon , 則還原到 Desktop上
這段是沒有問題的, 利用 縮至 tray 利用以下功能 ModifyTrayIcon(NIM_ADD); Form_Main.Hide; 還原, 利用 [code delphi] procedure TForm_Main.WndProc(var msg: TMessage); var mousePos: TPoint; begin case msg.Msg of WM_USER 1: begin case msg.LParam of WM_LBUTTONDOWN: begin GetCursorPos(mousePos); ModifyTrayIcon(NIM_DELETE); // 這邊是把 Tray icon 移除 Show(); end; end; end; end; inherited; end; [/code] 但我現在有一個問題, 我的 exe 只能執行一次, 所在 Dpr 專案一開始就限制如下, [code delphi] var AppWnd: HWND; begin Application.Initialize; AppWnd:= FindWindow('TApplication',主管理系統'); if AppWnd <> 0 then begin if IsIconic(AppWnd) then ShowWindow(AppWnd,SW_RESTORE) else SetForegroundWindow(AppWnd); end else begin Application.Title:= '主管理系統'; Application.CreateForm(TForm_Main, Form_Main); Application.Run; end; end. [/code] 如果我的程式在run的時候維持在桌面上(即不縮到tray中), 當第二次執行 exe, 可以讓form再度顯示到前景來, 但如果我將程式縮到 tray中, 在 DeskTop上已經不存在, 如果執行第二次 exe, form沒有辦法可以順利顯示出來, 必須在tray中再執行原先我上面所設定的WndProc才可以, 不知道各位前輩有沒有什麼辦法可以讓在 tray 中的 exe, 當第二次執行相同的exer時, 主動還原 tray 中的程式到桌面上來? |
cat200188
中階會員 ![]() ![]() ![]() 發表:37 回覆:78 積分:68 註冊:2005-01-18 發送簡訊給我 |
|
P.D.
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
現在的麻煩點是在於上面的判定程式是必須寫在 .dpr 專案的 source 中, 而不是在 unit 中
如果是在form中的控制, 都沒有問題, 而放在這邊是因為要控制程式不可二度被執行, 但 此程式又被放在 Tray中(即右下角的所謂常駐區), 造成 視窗還原時, 只能還原到 TaskBar 上, 而實際視窗卻出不來 program Costume; uses Windows, Forms, Main in 'Main.pas' {Form_Main}; {$R *.RES} var AppWnd: HWND; begin .... 寫在這裡 end; ===================引 用 cat200188 文 章=================== 版主: 試試使用SendMessage 在 SendMessage的時候改採自定義Messages.傳送指定參數; 而程式內部也接收此訊息,在訊息觸發且參數正確時觸發程式的顯示/隱藏 供版主參考 |
cat200188
中階會員 ![]() ![]() ![]() 發表:37 回覆:78 積分:68 註冊:2005-01-18 發送簡訊給我 |
版主:
或可考慮用 ShowWindow(MainForm,SW_SHOW); SetForegroundWindow(MainForm); 供參考一下 ===================引 用 P.D. 文 章=================== 現在的麻煩點是在於上面的判定程式是必須寫在 .dpr 專案的 source 中, 而不是在 unit 中 如果是在form中的控制, 都沒有問題, 而放在這邊是因為要控制程式不可二度被執行, 但 此程式又被放在 Tray中(即右下角的所謂常駐區), 造成 視窗還原時, 只能還原到TaskBar 上, 而實際視窗卻出不來 program Costume; uses Windows, Forms, Main in 'Main.pas' {Form_Main}; {$R *.RES} var AppWnd: HWND; begin .... 寫在這裡 end; ===================引 用 cat200188 文 章=================== 版主: 試試使用SendMessage 在 SendMessage的時候改採自定義Messages.傳送指定參數; 而程式內部也接收此訊息,在訊息觸發且參數正確時觸發程式的顯示/隱藏 供版主參考
------
....... |
P.D.
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
這些方法都已經試過, 但無法正常將WINDOW顯示出來, 不過我的一位好友提供了一個參考寫法,
我依據這個寫法已經解決了這個問題, 不過 c兄提到SendMessage重點, 我還是把分數給了c兄 MAIN.DPR 部份 [code delphi] program Main; uses Windows, Forms, Messages, Main in 'Main.pas' {Form_Main}; {$R *.RES} const WM_FORM = WM_USER 100; var AppWnd: HWND; hdl: integer; begin Application.Initialize; hdl:= OpenMutex(MUTEX_ALL_ACCESS, False, PChar('Main.exe')); if hdl <> 0 then begin AppWnd := FindWindow('TForm_Main', pChar('MainFormCaption')); if AppWnd <> 0 then SendMessage(AppWnd, WM_Form, 0, 0) end else begin CreateMutex(nil, False, PChar('Main.exe')); Application.Title:= 'MainFormCaption; Application.CreateForm(TForm_Main, Form_Main); Application.Run; end; end.[/code] form_main.pas段, 保留部份程式段, 僅秀重點 ... const WM_FORM = WM_USER 100; ... private { Private declarations } procedure CallExe(var msg: TMessage); message WM_FORM; implementation {$R *.DFM} procedure TForm_Main.ModifyTrayIcon(Action: DWORD); begin ..... end; procedure TForm_Main.CallExe(var msg: TMessage); begin if msg.Msg = WM_FORM then begin ModifyTrayIcon(NIM_DELETE); // 此功能在將 Tray中的Icon移除 Show(); end; end; ===================引 用 cat200188 文 章=================== 版主: 或可考慮用 ShowWindow(MainForm,SW_SHOW); SetForegroundWindow(MainForm); 供參考一下 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |