只執行乙個程式

2021-09-25 04:09:51 字數 1884 閱讀 2657

重複執行程式會造成系統資源的浪費(這句話真彆扭),很多情況 下我們把程式最小化或者隱藏起來,想用這個程式的時候會習慣的doulbeclick程式的圖示,wo~又乙個程式執行了,我們本意是既然已經是開啟的程式,你把程式再給我顯現出來不就可以了?弱智的程式設計師阿(不是說你,也不是說我,假想。。)

常見的方法有三種,一、原子方法;二、互斥量、三、查詢視窗(findwindow or enumwindow)

這是其中一種,晚上把這幾種方法都嘗試一邊,其實很簡單

(最近在學習asm,使用的masm32和radasm寫win32程式也很方便,和win32 sdk差不多)

szclassname         db'閘道器切換器[ihqq]',0

;only single instance is running

;szclassname is dialog name of instance

invoke findwindow,null,addr szclassname;查詢符合條件的視窗

.if eax != null  ;如果找到視窗

invoke showwindow,eax,sw_show  ;顯示出來

invoke setforegroundwindow,eax         ;放到最前面來;

invoke exitprocess,0                              ;結束本例項

.endif

;如果執行到這,說明沒有找到符合條件的視窗,也就是程式是第一次執行

事實上這樣並不能將視窗出現在最前面,以下抄襲別人

[setforegroundwindow會呼叫flashwindowex來閃爍目標視窗,代表已經切換了

視窗,但事實上往往我們需要在某個時候將我們的視窗彈出到最前台來!曾聽說過有高

手使用修改視窗切換的糸統規則來達到此目的,這樣做未必太麻煩了,必定不是每個人

都是高手呢!下面給大家介紹乙個"偏方",非常簡單,只是利用了乙個msdn未公開的函式罷了.

這個未公開的函式是:switchtothiswindow

它的c格式的原形是:

void winapi switchtothiswindow (

hwnd hwnd,   // handle to the window that should be activated

bool brestore // fauls表示最小化顯示;

); 由於沒有原型和庫,我們在使用時通常用動態聯接法]

szclassname         db'閘道器切換器[ihqq]',0

szfuname            db'switchtothiswindow',0

szuser32            db'user32.dll',0

;only single instance is running

;szclassname is dialog name of instance

invoke findwindow,null,addr szclassname

.if eax != null

mov  oldhwnd,eax

invoke showwindow,eax,sw_show

invoke getmodulehandle,addr szuser32    ;得到位址空間內user32.dll的模組控制代碼,因為user32已經載入,所以使用getmodulehandle,而不是loadlibrary,我們可以不考慮釋放問題;

invoke getprocaddress,eax,addr szfuname ;得到switchtothiswindow的位址;

push true

push oldhwnd

call eax

invoke exitprocess,0

.endif

perl,php程式只執行乙個

perlmy lock file getcwd test speed.lck open lck,lock file or die failed to open test speed lock flock lck,lock ex lock nb or die failed to aquire test...

讓程式只執行乙個例項(C )

通常我們會遇到這樣的情況,讓程式只執行乙個例項,比如啟動防毒軟體時,只能啟動乙個,再啟動的話就沒什麼效果!利用程式名來判斷不是乙個好辦法,如果我們把程式名稱改一下就可以執行兩個完全一樣的程序。我們最好利用程式集的attribute存放特定資訊,然後用assembly物件的getcustomattri...

保證乙個程式只執行一次

相信如果學過作業系統的朋友一定能夠看的懂.可以使用 waithandle.waitone 請求互斥體的所屬權。擁有互斥體的執行緒可以在對 wait 的重複呼叫中請求相同的互斥體而不會阻塞其執行。但執行緒必須呼叫 releasemutex 方法同樣多的次數以釋放互斥體的所屬權。如果執行緒在擁有互斥體期...