//聲明:{返回進程的控制代碼}OpenProcess( dwDesiredAccess: DWORD; {訪問選項} bInheritHandle: BOOL; {能否繼承; True 表示能用 CreateProcess 繼承控制代碼建立新進程} dwProcessId: DWORD {指定進程 ID}): THandle; {成功會返回進程控制代碼; 失敗返回 0}//dwDesiredAccess 可選值:PROCESS_TERMINATE = $0001; {允許 TerminateProcess 使用進程控制代碼來關閉進程}PROCESS_CREATE_THREAD = $0002; {允許 CreateRemoteThread 使用進程控制代碼來建立線程}PROCESS_VM_OPERATION = $0008; {允許 VirtualProtectEx 使用進程控制代碼來改變進程的虛擬記憶體}PROCESS_VM_READ = $0010; {允許 ReadProcessMemory 使用進程控制代碼從進程的虛擬記憶體中讀取資料}PROCESS_VM_WRITE = $0020; {允許 WriteProcessMemory 使用進程控制代碼向進程的虛擬記憶體中寫入資料}PROCESS_DUP_HANDLE = $0040; {允許 DuplicateHandle 把進程控制代碼當作源控制代碼或目標控制代碼進行複製}PROCESS_CREATE_PROCESS = $0080; {預設值}PROCESS_SET_QUOTA = $0100; {允許 SetProcessWorkingSetSize 使用進程控制代碼來來設定虛擬記憶體的上限值}PROCESS_SET_INFORMATION = $0200; {允許 SetPriorityClass 使用進程控制代碼來設定進程優先順序}PROCESS_QUERY_INFORMATION = $0400; {允許 GetExitCodeProcess 或 GetPriorityClass 通過進程控制代碼讀取進程資訊}SYNCHRONIZE = $00100000; {允許任何等待的函數使用進程控制代碼}PROCESS_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $FFF); {允許所有許可權}{擷取指定進程的退出碼}GetExitCodeProcess( hProcess: THandle; {進程控制代碼} var lpExitCode: DWORD {接收退出碼}): BOOL; {}{強制結束(其他)進程}TerminateProcess( hProcess: THandle; {進程控制代碼} uExitCode: UINT {退出碼}): BOOL; {}//提示: 關閉其他程式一般應該是向其主視窗發送 WM_CLOSE 訊息, 不行再用這個, 因為它不能關閉其關聯的 DLL.//舉例(強行關閉 OICQ 的辦法):unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);var id: Cardinal; wh: HWND; ph: THandle; ExitCode: DWORD;begin wh := FindWindow('#32770', nil); GetWindowThreadProcessId(wh, id); ph := OpenProcess(PROCESS_TERMINATE, False, id); GetExitCodeProcess(ph, ExitCode); TerminateProcess(ph, ExitCode);end;end.
提示: #32770 是提前知道的類名, 擷取方法可參見:
http://www.cnblogs.com/del/archive/2008/03/09/1097942.html
GetWindowThreadProcessId 函數請參見: http://www.cnblogs.com/del/archive/2008/03/10/1098475.html