全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2545
推到 Plurk!
推到 Facebook!

Delphi 2010透過Tray物件,縮小到system 工作列後如何切換回來問題

缺席
u8923538
一般會員


發表:7
回覆:2
積分:1
註冊:2010-12-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-03-06 04:16:24 IP:59.126.xxx.xxx 訂閱
各位前輩好:

想請教,我自己寫一個簡單的程式,想透過TrayIcon這個物件,將程式可以縮到系統工作列
這部分已經OK,不過若要判斷程式重複執行,若有則切換到這個程式的主視窗,並且將視窗移到桌面的最上層,就會無法成功。
貼上自己亂寫的CODE還請前輩給予一些指導。
http://www.tek-tips.com/viewthread.cfm?qid=1154022&page=101



[code delphi]
program Menu4WebLink;
uses
Forms, Windows,
Unit1 in 'Unit1.pas' { Form1 } ,
{$R *.res}
var
Mutex: THandle;
hw: HWND;
begin
Mutex := CreateMutex(nil, True, 'Menu4WebLink');
if (Mutex = 0) OR (GetLastError = ERROR_ALREADY_EXISTS) then
begin
// code to searh for, and activate
// the previous (first) instance
// MessageBox(0, '程式執行中', '警告', mb_iconhand);
hw := FindWindow(nil, Pchar('Menu4WebLink'));
// ForceForegroundWindow(Application - > MainForm - > Handle);
SetActiveWindow(hw);
SetForegroundWindow(hw); // 設定焦點
BringWindowToTop(hw);
ShowWindow(hw, SW_SHOWNORMAL);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, SPIF_SENDCHANGE);
// ShowWindow(hw, SW_MAXIMIZE);
keybd_event(Ord(#1), 0, 0, 0);
keybd_event(Ord(#1), 0, KEYEVENTF_KEYUP, 0);
Application.NormalizeAllTopMosts;
Application.Terminate;
end
else
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end;
[/code]

編輯記錄
u8923538 重新編輯於 2011-03-05 13:17:15, 註解 無‧
u8923538 重新編輯於 2011-03-05 13:18:06, 註解 無‧
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-03-11 19:11:48 IP:211.75.xxx.xxx 未訂閱
您是用另一支程式呼叫 TrayIcon 程式的,參考 About 解說看看
http://delphi.about.com/cs/adptips2000/a/bltip1200_4.htm
zhweizw
一般會員


發表:7
回覆:16
積分:9
註冊:2008-01-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-05-11 10:59:23 IP:218.3.xxx.xxx 訂閱
其实你可以不使用api函数,使用delphi 2010 自带一个TrayIcon物件即可满足你的要求。

[code delphi]
program Server;
uses
Windows,
Messages,
Forms,
UntMain in 'UntMain.pas' { Form1 } ,
{$R *.res}
const
SHOW_R = 1;
WM_USERMSG=10020;

var
MainForm: HWND;

begin
MainForm := FindWindow('TForm1', PChar(‘form标题’));
if MainForm > 0 then
begin
PostMessage(MainForm, WM_USERMSG, SHOW_R, 0);
Exit;
end;
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
[/code]


[code delphi]
procedure TForm1.WndProc(var Msg: TMessage);
begin
if (Msg.Msg = WM_SYSCOMMAND) and ((Msg.WParam = SC_CLOSE) or
(Msg.WParam = SC_MINIMIZE)) then
begin
Msg.Msg := 0;
hide;
end;
inherited;
end;

[/code]

[code delphi]
procedure TForm1.WMUSERMSG(var Msg: TMessage);
begin
if Msg.Msg = WM_USERMSG then
begin
case Msg.WParam of
SHOW_R:
Visible := True;
end;
end;
end;
[/code]



===================引 用 u8923538 文 章===================

各位前輩好:

想請教,我自己寫一個簡單的程式,想透過TrayIcon這個物件,將程式可以縮到系統工作列
這部分已經OK,不過若要判斷程式重複執行,若有則切換到這個程式的主視窗,並且將視窗移到桌面的最上層,就會無法成功。
貼上自己亂寫的CODE還請前輩給予一些指導。
http://www.tek-tips.com/viewthread.cfm?qid=1154022&page=101



[code delphi]
program Menu4WebLink;
uses
Forms, Windows,
Unit1 in 'Unit1.pas' { Form1 } ,
{$R *.res}
var
Mutex: THandle;
hw: HWND;
begin
Mutex := CreateMutex(nil, True, 'Menu4WebLink');
if (Mutex = 0) OR (GetLastError = ERROR_ALREADY_EXISTS) then
begin
// code to searh for, and activate
// the previous (first) instance
// MessageBox(0, '程式執行中', '警告', mb_iconhand);
hw := FindWindow(nil, Pchar('Menu4WebLink'));
// ForceForegroundWindow(Application - > MainForm - > Handle);
SetActiveWindow(hw);
SetForegroundWindow(hw); // 設定焦點
BringWindowToTop(hw);
ShowWindow(hw, SW_SHOWNORMAL);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, SPIF_SENDCHANGE);
// ShowWindow(hw, SW_MAXIMIZE);
keybd_event(Ord(#1), 0, 0, 0);
keybd_event(Ord(#1), 0, KEYEVENTF_KEYUP, 0);
Application.NormalizeAllTopMosts;
Application.Terminate;
end
else
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end;
[/code]

smallfox
高階會員


發表:2
回覆:113
積分:128
註冊:2003-02-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-06-29 00:47:35 IP:203.73.xxx.xxx 訂閱
利用 TTrayIcon 縮小程式至系統列後再回復正常大小, 我的寫法如下, 只是我是寫在 O n C l i c k 事件中,

給你參考自行應用修改:

procedure TForm1.TrayIcon1Click(Sender: TObject);
begin
TrayIcon1.Visible:=False;
if (not Application.MainForm.Showing) then Application.MainForm.Show;
Application.Restore;
Application.BringToFront;
Application.MainForm.SetFocus;
end;
james2mac
一般會員


發表:11
回覆:11
積分:4
註冊:2008-02-01

發送簡訊給我
#5 引用回覆 回覆 發表時間:2012-07-03 14:30:52 IP:218.210.xxx.xxx 訂閱
試試

Form1.Show;
ShowWindow(Application.Handle, SW_SHOWDEFAULT);

系統時間:2017-10-19 20:52:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!