?? 避免二次運行 (2000年8月11日).txt
字號:
避免二次運行 (2000年8月11日)
本站更新 分類: 作者:轉載至http://www.nease.net/~ganglion 推薦: 閱讀次數:731
(http://www.codesky.net)
--------------------------------------------------------------------------------
轉載至http://www.nease.net/~ganglion
實現單實例運行的關鍵是判斷前一實例是否存在,Win3.x中運行的程序能獲知前一實例的句柄,
從而可以方便地進行判斷,但 Windows 95 是搶先式多任務系統,其程序的前一實例句柄恒為零,
所以只有另尋其他辦法。目前最有效的辦法是通過查看是否有相同窗口類名的例程存在來進行判斷。
下面介紹在Delphi中實現的方法。
1、對主窗口程序的改動:
在主窗口(即程序創建的第一個窗口)中interface節加入
const
CM_RESTORE = WM_USER + $1000; {自定義的"恢復"消息}
MYAPPNAME = "My Delphi Program";
并在Form的定義的public節中加入
procedure CreateParams(var Params: TCreateParams); override;
Procedure RestoreRequest(var message: TMessage); message CM_RESTORE;
在implementation節中加入
{指定窗口名稱}
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.WinClassName := MYAPPNAME;
end;
{處理"恢復"消息}
procedure TForm1.RestoreRequest(var message: TMessage);
begin
if IsIconic(Application.Handle) = TRUE then
Application.Restore
else
Application.BringToFront;
end;
經過以上修改,程序的主窗口的類名已經被指定了,這是進行判斷的基礎。一般在程序剛開始運行的時候進
行判斷,所以還要對DPR文件進行修改。
2、對DPR文件的改動
在 uses 節中添加 windows、messages這兩個單元加入下列語句,注意兩個文件中常量CM_RESTORE和
MYAPPNAME的定義必須一致
const
CM_RESTORE = WM_USER + $1000; {自定義的"恢復"消息}
MYAPPNAME = "My Delphi Program";
var
RvHandle : hWnd;
將下列語句插到程序最前部(在Application.Initialize之前)
RvHandle := FindWindow(MYAPPNAME, NIL);
if RvHandle > 0 then
begin
PostMessage(RvHandle, CM_RESTORE, 0, 0);
Exit;
end;
這段程序的意思是如果找到一個類名相同的窗口,則向該窗口發送一個消息,并退出,而本例中原窗口收到
該消息后會自動激活或從圖標還原,從而達到了避免二次運行且能自動調出前一例程的目的。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -