Re: [VB6 ] 如何偵測某一個桯式(如小畫家)已經結束?

看板Visual_Basic作者 (chino)時間12年前 (2011/10/06 02:07), 編輯推噓3(304)
留言7則, 4人參與, 最新討論串4/4 (看更多)
※ 引述《kandrew (藍天白雲~~)》之銘言: : Hi chino,謝謝您提供此方法!! : 我利用此方法,確實可以偵測到特定的程式是否結束, : 但如果標題會改變的程式,就比較難偵測到了, : 例如要偵測小畫家是否結束,當你開新檔時小畫家的標題為"未命名-小畫家" : 然後再開另一個圖檔則標題則變為"xxxx-小畫家",這樣就會判斷失敗了。 : 是否還有別的函數可以判斷部分標題名稱的函式,例如只判斷"小畫家" : 如果如此,這樣就可以正確的偵測出程式是否結束了。 : ※ 引述《chinoyan (chino)》之銘言: : : 'API宣告 : : Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal : : lpClassName As String, ByVal lpWindowName As String) As Long : : ' 視窗的class ,"XXX"視窗標題,不知class填vbNullString即可 : : ' 傳回值為window hwnd, 不存在傳回 0 : : If FindWindow(vbNullString, "XXX") <> 0 Then : : End If '方法一 Dim Pid as long pid = GetPsPid("小畫家.exe") If pid <> 0 Then End If Option Explicit ' IN 模組 Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long Private Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, lppe As PROCESSENTRY32) As Long Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapShot As Long, lppe As PROCESSENTRY32) As Long Public Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long Private Declare Sub CloseHandle Lib "kernel32" (ByVal hPass As Long) Private Const TH32CS_SNAPPROCESS = &H2& Private Type PROCESSENTRY32 dwSize As Long cntUsage As Long th32ProcessID As Long th32DefaultHeapID As Long th32ModuleID As Long cntThreads As Long th32ParentProcessID As Long pcPriClassBase As Long dwFlags As Long szExeFile As String * 260 End Type Const PROCESS_TERMINATE = 1 Function GetPsPid(sProcess As String) As Long Dim lSnapShot As Long Dim lNextProcess As Long Dim tPE As PROCESSENTRY32 lSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0&) If lSnapShot <> -1 Then tPE.dwSize = Len(tPE) lNextProcess = Process32First(lSnapShot, tPE) Do While lNextProcess If LCase$(sProcess) = LCase$(Left(tPE.szExeFile, InStr(1, tPE.szExeFile, Chr(0)) - 1)) Then Dim lProcess As Long Dim lExitCode As Long GetPsPid = tPE.th32ProcessID CloseHandle lProcess End If lNextProcess = Process32Next(lSnapShot, tPE) Loop CloseHandle (lSnapShot) End If End Function ============================================================================= '方法二 EnumWindows AddressOf EnumWindowsProc, 0& '引用 'in 模組 Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Boolean On Error Resume Next Dim S As String S = String(40, 0) Call GetWindowText(hwnd, S, 40) S = Left(S, InStr(S, Chr(0)) - 1) If Len(S) > 0 Then If InStr(S, "小畫家") > 0 Then ' End If End If EnumWindowsProc = True ' 表示繼續列舉 hWnd End Function -- ████ █ ★ ████ █ █ █ █ █ █ █ █ █ 超 級 熱 烈 歡 迎 █ ████ █ █ █ ████ █ █ █ █ █ ███★ █ █ 歡迎到嘉義版! ★███ █ █ █ █ █ █ █ 訊馳電腦-路徑嘉義市林森西路496號(05)2244-526順發斜對面 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.33.214.160

10/06 09:38, , 1F
就是想推原po的熱心
10/06 09:38, 1F

10/06 17:27, , 2F
我利用方法二,成功偵測出特定程式是否結束。感謝C大!!!
10/06 17:27, 2F

10/06 21:32, , 3F
太熱心了 ~~~ 推
10/06 21:32, 3F

10/06 21:33, , 4F
有code128的經驗談分享嗎 @@
10/06 21:33, 4F

10/06 21:36, , 5F
CODE 128 是什麼??
10/06 21:36, 5F

10/06 21:42, , 6F
code 128 條碼字型 最近光搞這就飽了.....
10/06 21:42, 6F

10/07 01:40, , 7F
RS232 沒玩過.SORRY
10/07 01:40, 7F
文章代碼(AID): #1EZ9pPt0 (Visual_Basic)
討論串 (同標題文章)
文章代碼(AID): #1EZ9pPt0 (Visual_Basic)