2010-12-10 10 views

答えて

1

処理していないそのプロセスの名前を持っているために他の実行中のプロセス

に近いMessgeを送信したいです.NETを指定する)、次のコードできます。基本的にはどのようなこのコードはありませんが、あなたが欲しいものを見つけるために現在実行中のすべてのプロセスを列挙する

''#Module-level WinAPI Declarations 
Private Const PROCESS_ALL_ACCESS = &H1F0FFF 
Private Const TH32CS_SNAPPROCESS As Long = 2& 

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 

Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal blnheritHandle As Long, ByVal dwAppProcessId As Long) As Long 
Private Declare Function ProcessFirst Lib "kernel32.dll" Alias "Process32First" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long 
Private Declare Function ProcessNext Lib "kernel32.dll" Alias "Process32Next" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long 
Private Declare Function CreateToolhelpSnapshot Lib "kernel32.dll" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, lProcessID As Long) As Long 
Private Declare Function TerminateProcess Lib "kernel32.dll" (ByVal ApphProcess As Long, ByVal uExitCode As Long) As Long 
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long 

''#Public function to actually kill a process, given its name 
Public Sub KillProcess(ByVal ProcessName As String) 
    Dim uProcess As PROCESSENTRY32 
    Dim RProcessFound As Long 
    Dim hSnapshot As Long 
    Dim SzExeName As String 
    Dim ExitCode As Long 
    Dim MyProcess As Long 
    Dim AppKill As Boolean 
    Dim AppCount As Integer 
    Dim i As Integer 

    If LenB(ProcessName) <> 0 Then 
     AppCount = 0 

     uProcess.dwSize = Len(uProcess) 
     hSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&) 
     RProcessFound = ProcessFirst(hSnapshot, uProcess) 

     Do 
      i = InStr(1, uProcess.szexeFile, Chr(0)) 
      SzExeName = LCase$(Left$(uProcess.szexeFile, i - 1)) 

      If Right$(SzExeName, Len(ProcessName)) = LCase$(ProcessName) Then 
       AppCount = AppCount + 1 
       MyProcess = OpenProcess(PROCESS_ALL_ACCESS, False, uProcess.th32ProcessID) 
       AppKill = TerminateProcess(MyProcess, ExitCode) 
       Call CloseHandle(MyProcess) 
      End If 

      RProcessFound = ProcessNext(hSnapshot, uProcess) 
     Loop While RProcessFound 

     Call CloseHandle(hSnapshot) 
    End If 
End Sub 

です殺すため。 CreateToolHelpSnapshot API functionはプロセスのスナップショットを返し、次にProcess32FirstProcess32Nextの関数でこのスナップショットをループします。指定した名前と一致するものが見つかると、TerminateProcess functionを使用してそのプロセスとそのスレッドをすべて終了します。 これは、Windows XP以降のバージョンではテストされていないことに注意してください。

あなたが流暢にWin32のを話す場合は、次のMSDNの記事を参照してください。Taking a Snapshot and Viewing Processes

あなたがインターネット上で見つけるの例の多く(すなわち、option oneoption two)に関連付けられたウィンドウにWM_CLOSE messageを送信するためにEnumWindowsを使用特定のプロセス。これは、WM_CLOSEメッセージを送信すると、データを保存して正常に終了することができます。上記の例で使用されているTerminateProcessはあまりいいことではありません。それは即座にbuzz-killです。しかし、それはは、ウィンドウを所有していないプロセスを終了することができます。これが質問の要件であるかどうかは言及していません。

(正直なところ、この質問にお答えしようとしているの企業には質問がありませんが、私は遅れています。私に知らせるためにコメントを追加してください...)

関連する問題