我們的程式有時候只允許執行一次,並且最好的情況是,如果程式第二次執行,就啟用原來的程式。網上有很多的方法實現程式只執行一次,但對於啟用原來的視窗卻都不怎麼好。
關鍵就在於啟用原來的程式,一般的做法是在工程開始時,開啟互斥量物件,如果打不開表示程式還沒有執行,建立乙個互斥量物件;如果打得開表示程式已經執行了,查詢程式中乙個特定的視窗,一般是主視窗,然後傳送乙個自定義訊息,主視窗在這個訊息處理中啟用自己。我原來就是這麼做的,卻發現有很多問題。
主視窗在訊息處理函式中啟用不了自己,眾所周知啟用乙個視窗最有效的方法當然就是setforegroundwindow,但在主視窗中呼叫這個函式啟用自己的效果卻是只在標題欄閃了一閃,如果在其他程序呼叫該函式則不會有問題;另外,如果程式是最小化的,它連閃都不閃了。
看來一切都很好,當然不是,不然就不會有下面的**了,我又發現了一些問題,首先當主窗體不是活動視窗時,比如主窗體被隱藏了,而目前活動的窗體是其他窗體,則上面的**無效。另乙個,如果主窗體前面有乙個showmodal的窗體,則上面的**後,主窗體跑到showmodal窗體的前面了。
原來是用getlastactivepopup這個api找到程式擁有的窗體中最近啟用的窗體,然後再啟用它。
花了乙個小時的試驗,最終有了下面的**,結果非常成功:
unit wdrunonce;
inte***ce
implementation
uses
windows, messages;
const
mapfilename = '';
varhmapfile: thandle;
psmem: psharemem;
procedure freemapfile;
begin
unmapviewoffile(psmem);
closehandle(hmapfile);
end;
initialization
createmapfile;
finalization
freemapfile;
end.
program project1;
uses
forms,
unit1 in 'unit1.pas'
wdrunonce in 'wdrunonce.pas',
unit2 in 'unit2.pas'
多新建一些視窗測試一下吧,不過要注意新建的視窗得不能是自動建立的。
Windows讓程式只執行一次
一 通過建立互斥量來判斷 winapi winmain hinstance,hinstance,lpstr,int if getlasterror error already exists catch exception exception return 0 二 用系統原子 winapi winma...
VC程式只執行一次例項
方法一 建立全域性互斥體,然後在程序啟動時檢查該互斥體是否已被建立 只需要在initinstance 中加入 方法二 乙個程式可以執行多個例項 程序 那我們如何讓它僅執行乙個例項呢?很簡單,使用 pragma編譯器指令在程序的位址空間內建立乙個 共享節 就可以 達到目的,這個 共享節 裡的資料為多個...
VC程式只執行一次例項
方法一 建立全域性互斥體,然後在程序啟動時檢查該互斥體是否已被建立 只需要在initinstance 中加入 方法二 一 個程式可以執行多個例項 程序 那我們如何讓它僅執行乙個例項呢?很簡單,使用 pragma編譯器指令在程序的位址空間內建立乙個 共享節 就可以 達到目的,這個 共享節 裡的資料為多...