線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1639
推到 Plurk!
推到 Facebook!

有關 TrayIcon 的還原問題

答題得分者是:cat200188
P.D.
版主


發表:571
回覆:3888
積分:3677
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-04-24 22:14:54 IP:118.169.xxx.xxx 未訂閱
我寫了一個功能, 按下一個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 中的程式到桌面上來?

編輯記錄
P.D. 重新編輯於 2012-04-24 08:16:50, 註解 無‧
P.D. 重新編輯於 2012-04-24 08:17:56, 註解 無‧
cat200188
中階會員


發表:37
回覆:78
積分:68
註冊:2005-01-18

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-04-25 14:48:06 IP:59.126.xxx.xxx 訂閱
版主:
試試使用SendMessage
在 SendMessage的時候改採自定義Messages.傳送指定參數;
而程式內部也接收此訊息,在訊息觸發且參數正確時觸發程式的顯示/隱藏

供版主參考
------
.......
P.D.
版主


發表:571
回覆:3888
積分:3677
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-04-26 18:54:56 IP:118.169.xxx.xxx 未訂閱
現在的麻煩點是在於上面的判定程式是必須寫在 .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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2012-04-27 11:51:12 IP:59.126.xxx.xxx 訂閱
版主:
或可考慮用
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.
版主


發表:571
回覆:3888
積分:3677
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2012-04-27 16:34:20 IP:118.169.xxx.xxx 未訂閱
 這些方法都已經試過, 但無法正常將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);
供參考一下
系統時間:2017-12-13 15:29:23
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!