作者tropical72 (藍影)
看板C_and_CPP
標題Re: [問題] 請問要怎讓程式不可同時多個副本在運行?
時間Fri Jul 29 03:25:39 2011
這問題簡單的說:防程式多開。
※ 引述《DrStein (啤酒肚)》之銘言:
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
: windows linux都要 XD
恕刪。我只會 windows,有誤請更正。
程式碼大致上有給,但其實寫得很不好,
裡面大概還要再拆 3~4 個 function 才會比較好用。
----------
在做這動做 (防程式多開),我所知道有二種方式
1. 先將 CurrentWindow 做 SetWindowText(cur_wnd, garbge_string);
用 FindWindow 查 window title 是否有執行過,沒執行過的話再
SetWindowText(cur_wnd, window_title),
如果程式執行中 window title 會變就不適用。
類似的方法是先用 EnumWindow 做,不贅述。
2. 直接 enum process (有二種方式,一種用 psapi,一種用 tlhelp32),
執行前先 cur_pid = GetCurrentPid(); 再 travel procee id,
取得 pid 後,再用 EnumProcessModules ,GetModuleBaseName
相關函式取得執行檔名 (就是工作管理員裡面看到的),
若 cur_pid != pic 且 執行檔名一樣,就判定為同一支程式。
其它可能會用到的,
GetForegroundWindow : 這裡先引一個問題,假設 A.exe 執行,再執行 B.exe,
若 B.exe 有實體視窗,抓出來的一定是 B.exe,除非先將 B.exe 隱藏。
SetForgroundWindow : 設定當前視窗,類似函式有 BringWindowToTop,
去 MSDN 查二者差異。
HWND 轉 PID :這沒問題,GetWindowThreadProcessId。
PID 轉 HWND :這是瓶頸重點。這部份不好寫,
比較建議直接去下別人包好的 class/library 下來用。
推 purpose:好奇那些用 patch 破解軟體單開限制的人,是怎麼做到07/29 02:55
→ purpose:難道是直接跳過檢驗區段的程式,如此暴力?07/29 02:55
我沒記錯的話,已經有人可以改「工作管理員」上的執行程式名稱 (不非常確定)
保險一點再加上 SetWindowText,應可騙過不少程式。
----------
淺見而已,有誤請指正。
--
YouLoveMe() ? LetItBe() : LetMeFree();
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.78.41
推 purpose:嗯,行程名稱大概會是 Kernel 在管,惡意軟體有最強烈的 07/29 04:01
→ purpose:改名動機,大概得取得高點的權限,或者攻擊工作管理員 07/29 04:02
→ purpose:賭一般人不會用第二套軟體去查看行程資訊 07/29 04:02