حالا که یک چیزی از برنامهای رو که میخوای ببندی رو گفتی میشه چیزی در جواب گفت. البته اگر گفته بودی که میخوای برنامه عادی بسته بشه یا اینکه در هر صورت اجراش رو قطع کنی بهتر بود. تو کد زیر که توضیحش رو قراره بدم فرض رو بر این گذاشتم که برنامه دیگه رو میخوای به طور عادی ببندی٬ به این معنا که مثلا اگر قرار Notepad بسته بشه و متن موجود درش ذخیره نشده٬ کاربر قادر باشه که متن رو قبل از خروج ذخیره کنه.
با استفاده از اسم برنامه میشه مشخصه پروسه (Process ID) اون رو پیدا کرد. بعد از پیدا کردن مشخصه پروسه (Process ID) برنامه، تو تمام پنجرههای اصلی (Top Level Windows) برنامههایی که در حال اجرا هستند میگردیم و پنجرهای رو پیدا میکنیم که مشخصه پروسه (Process ID) اون با مشخصه پروسه (Process ID) برنامهای که داریم یکی باشه تا پنجره اصلی (Main Window Handle) اون برنامه را پیدا کنیم. با داشتن پنجره اصلی (Main Window Handle) برنامه و با فرستادن پیام WM_CLOSE به اون٬ از برنامه تقاضای بسته شدن عادی رو میکنیم، یا میتونیم پیام WM_QUIT رو بفرستیم که برنامه فورا" خاتمه پیدا کنه.
uses
Messages, Windows, SysUtils, TLHelp32;
function FindExecutableProcessID(const ExeName: String): DWORD;
var
Snapshot: THandle;
ProcessEntry32: TPROCESSENTRY32;
begin
Result := 0;
Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
try
if Snapshot <> 0 then
begin
ProcessEntry32.dwSize := SizeOf(TPROCESSENTRY32);
if Process32First(Snapshot, ProcessEntry32) then
repeat
if CompareText(ExeName, ExtractFileName(ProcessEntry32.szExeFile)& #41; = 0 then
Result := ProcessEntry32.th32ProcessID;
until (Result <> 0) or not Process32Next(Snapshot, ProcessEntry32);
end;
finally
CloseHandle(Snapshot);
end;
end;
type
PFindMainWindowData = ^ TFindMainWindowData;
TFindMainWindowData = record
ProcessID: DWORD;
WindowHandle: THandle;
end;
function EnumWindowsProc(Wnd: THandle; Param: PFindMainWindowData): BOOL; stdcall;
var
ProcessID: DWORD;
begin
Result := True;
GetWindowThreadProcessId(Wnd, ProcessID);
if ProcessID = Param^.ProcessID then
begin
Param^.WindowHandle := Wnd;
Result := False;
end;
end;
function FindMainWindowHandle(ProcessID: DWORD): THandle;
var
Data: TFindMainWindowData;
begin
Data.ProcessID := ProcessID;
Data.WindowHandle := 0;
EnumWindows(@EnumWindowsProc, Integer(@Data));
Result := Data.WindowHandle;
end;
function CloseApplication(const ExeName: String; Normal: Boolean): Boolean;
var
ProcessID: DWORD;
MainWindowHandle: THandle;
begin
Result := False;
ProcessID := FindExecutableProcessID(ExeName);
if ProcessID <> 0 then
begin
MainWindowHandle := FindMainWindowHandle(ProcessID);
if MainWindowHandle <> 0 then
begin
if Normal then
PostMessage(MainWindowHandle, WM_CLOSE, 0, 0)
else
PostMessage(MainWindowHandle, WM_QUIT, 0, 0);
Result := True;
end;
end;
end;
به عنوان نمونه:
if CloseApplication('notepad.exe', True) then
MessageBox('One instance of Notepad closed.')
else
MessageBox('Notpad is not running to close!');