2011-08-08 53 views
4

在Windows上,我想通過'exename.exe'的名稱找到一個進程,然後殺死它。如何通過名稱找到進程並使用ctypes進行kill?

如何通過ctypes而不是任何其他第三方模塊來做到這一點?

+2

調用EnumProcesses然後TerminateProcess。 –

+1

@David Heffernan - 呃,怎麼樣? – Synapse

+0

你知道ctypes嗎?我只是想在你嘗試編寫這樣的代碼之前弄清楚你知道的和你不知道的。 –

回答

7

試試這個:

import sys, os.path, ctypes, ctypes.wintypes 

Psapi = ctypes.WinDLL('Psapi.dll') 
EnumProcesses = Psapi.EnumProcesses 
EnumProcesses.restype = ctypes.wintypes.BOOL 
GetProcessImageFileName = Psapi.GetProcessImageFileNameA 
GetProcessImageFileName.restype = ctypes.wintypes.DWORD 

Kernel32 = ctypes.WinDLL('kernel32.dll') 
OpenProcess = Kernel32.OpenProcess 
OpenProcess.restype = ctypes.wintypes.HANDLE 
TerminateProcess = Kernel32.TerminateProcess 
TerminateProcess.restype = ctypes.wintypes.BOOL 
CloseHandle = Kernel32.CloseHandle 

MAX_PATH = 260 
PROCESS_TERMINATE = 0x0001 
PROCESS_QUERY_INFORMATION = 0x0400 

count = 32 
while True: 
    ProcessIds = (ctypes.wintypes.DWORD*count)() 
    cb = ctypes.sizeof(ProcessIds) 
    BytesReturned = ctypes.wintypes.DWORD() 
    if EnumProcesses(ctypes.byref(ProcessIds), cb, ctypes.byref(BytesReturned)): 
     if BytesReturned.value<cb: 
      break 
     else: 
      count *= 2 
    else: 
     sys.exit("Call to EnumProcesses failed") 

for index in range(BytesReturned.value/ctypes.sizeof(ctypes.wintypes.DWORD)): 
    ProcessId = ProcessIds[index] 
    hProcess = OpenProcess(PROCESS_TERMINATE | PROCESS_QUERY_INFORMATION, False, ProcessId) 
    if hProcess: 
     ImageFileName = (ctypes.c_char*MAX_PATH)() 
     if GetProcessImageFileName(hProcess, ImageFileName, MAX_PATH)>0: 
      filename = os.path.basename(ImageFileName.value) 
      if filename == 'notepad.exe': 
       TerminateProcess(hProcess, 1) 
     CloseHandle(hProcess) 
+0

非常感謝。我感謝你的耐心。 – Synapse

+0

順便說一句,你能推薦我一些書籍或項目,我可以深入瞭解ctypes和python,以便改進我的編碼。我是一名新生,剛開始學習python,我發現它很有趣。 – Synapse

+0

我最喜歡學習Python的書是[Learning Python](http://oreilly.com/catalog/9781565924642/)。我認爲你不會找到任何關於ctypes的印刷材料,因爲它是這樣一個專業話題。 –

9

這可能是欺騙,但它的工作原理,甚至沒有捲入ctypes的。

import subprocess 
subprocess.call("taskkill /IM exename.exe") 

taskkill是一個Windows命令;這只是通過Python調用它。

+0

這是一個超優雅的解決方案!人們往往會忘記你可以在Python中運行任意進程。 +1 –

+0

@Matt - 哇,這很好,哈。謝謝你。 – Synapse

+1

我當然不是在做這樣的事情,但它是優雅的反面! ctypes代碼是醜陋的,但它直接調用OS例程而不是構建/解析/運行/拆除另一個程序來執行它。 –

相關問題