高分貼,
如何把,在程式運行并最小化成托盤圖示后,再次雙擊該程式,使原來的最小化程式激活,并在視窗最前方,注意,是再次點運行程式的圖示,不是托盤圖示,是再次點運行程式的圖示,不是托盤圖示。謝謝!
uj5u.com熱心網友回復:
你用delphi幾uj5u.com熱心網友回復:
d7的示例,用了TTrayIconhttp://pan.baidu.com/share/link?shareid=3394217811&uk=1124482001
uj5u.com熱心網友回復:
是再次點運行程式的圖示?啥意思?發個圖上來看看uj5u.com熱心網友回復:
這不就是只啟動一個實體嗎,程式啟動的時候檢測某種標志,比如一個semaphore,如果有的話就說明之前啟動過了,那就用某種方法,比如發送用戶訊息,通知前一實體激活,然后自己退出。uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
從網上轉過來的,沒有試過,你可以參考一下:unit MultInst;
interface
uses
Windows ,Messages, SysUtils, Classes, Forms;
implementation
const
STR_UNIQUE = '{2BE6D96E-827F-4BF9-B33E-8740412CDE96}';
MI_ACTIVEAPP = 1; //激活應用程式
MI_GETHANDLE = 2; //取得句柄
var
iMessageID : Integer;
OldWProc : TFNWndProc;
MutHandle : THandle;
BSMRecipients : DWORD;
function NewWndProc(Handle: HWND; Msg: Integer; wParam, lParam: Longint):
Longint; stdcall;
begin
Result := 0;
if Msg = iMessageID then
begin
case wParam of
MI_ACTIVEAPP: //激活應用程式
if lParam<>0 then
begin
//收到訊息的激活前一個實體
//為什么要在另一個程式中激活?
//因為在同一個行程中SetForegroundWindow并不能把表單提到最前
if IsIconic(lParam) then
OpenIcon(lParam)
else
SetForegroundWindow(lParam);
//終止本實體
Application.Terminate;
end;
MI_GETHANDLE: //取得程式句柄
begin
PostMessage(HWND(lParam), iMessageID, MI_ACTIVEAPP,
Application.Handle);
end;
end;
end
else
Result := CallWindowProc(OldWProc, Handle, Msg, wParam, lParam);
end;
procedure InitInstance;
begin
//取代應用程式的訊息處理
OldWProc := TFNWndProc(SetWindowLong(Application.Handle, GWL_WNDPROC,
Longint(@NewWndProc)));
//打開互斥物件
MutHandle := OpenMutex(MUTEX_ALL_ACCESS, False, STR_UNIQUE);
if MutHandle = 0 then
begin
//建立互斥物件
MutHandle := CreateMutex(nil, False, STR_UNIQUE);
end
else begin
Application.ShowMainForm := False;
//已經有程式實體,廣播訊息取得實體句柄
BSMRecipients := BSM_APPLICATIONS;
BroadCastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE,
@BSMRecipients, iMessageID, MI_GETHANDLE,Application.Handle);
end;
end;
initialization
//注冊訊息
iMessageID := RegisterWindowMessage(STR_UNIQUE);
InitInstance;
finalization
//還原訊息處理程序
if OldWProc <> Nil then
SetWindowLong(Application.Handle, GWL_WNDPROC, LongInt(OldWProc));
//關倍訓斥物件
if MutHandle <> 0 then CloseHandle(MutHandle);
end.
uj5u.com熱心網友回復:
樓主照我說的試試,一個比較簡單的例子,使用cooltrayicon。在主界面中添加此控制元件,然后在主界面的onclose事件里寫入action=canone即可。XE之后的高版本,在執行onclose的時候,直接有caminisize、cahide可供設定。
uj5u.com熱心網友回復:
沒看清楚。。。抱歉 我有個例子,明天再發吧,已經在被窩了,呵呵轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/130925.html
標籤:VCL組件開發及應用
下一篇:quickrep 報表問題
