PDA

View Full Version : بستن یک application



MKazemi
سه شنبه 25 شهریور 1382, 15:40 عصر
سلام من میخواستم ببینم که چطور می‏تونم از تو یک application یک application دیگه رو ببندم؟ :?:
مرسی :wink:

SyntaxCheck
سه شنبه 25 شهریور 1382, 16:25 عصر
SendMessage(Handle,WM_CLOSE,0,0);

SReza1
سه شنبه 25 شهریور 1382, 19:00 عصر
سلام
آقای syntax checking
من نتونستم بفهمم که
1-چطور handle برنامه ای رو که نمی دونیم پیدا کنیم.
2- اگه اصلا اون Application را ما ننوشته باشیم چی؟
ممنون میشم جواب بدی

SyntaxCheck
چهارشنبه 26 شهریور 1382, 02:46 صبح
سلام
ای بابا آقا رضا برنامه ای رو که نمیدونیم چی هست رو واسه چی میخوایم ببندیم آخه :wink:
اگر اسم برنامه و یا کلاس اصلی فرم اونو بدونیم با توابع خوانواده FindWindow میشه هندلشو پیدا کرد.
اگر هم هیچی ندونیم ازش و مثلا بخوایم پنجره ای که زیر موس هست رو پیدا کنیم میتونیم اول با GetCursorPos محل موس رو پیدا کنیم و بعدش با WindowFromPoint هندلش رو.

پیروز و شاد باشید

SReza1
چهارشنبه 26 شهریور 1382, 22:37 عصر
خوب حالا من اگه بخوام از این جور برنامه ها ببندم چکار کنم؟ :shock:

Kambiz
چهارشنبه 26 شهریور 1382, 23:44 عصر
از اون برنامه‌ای که قراره بسته بشه چه چیزیش رو می‌دونی؟
یا به عبارت دیگه از کجا تشخیص می‌دی که کدوم برنامه باید بسته بشه؟

SyntaxCheck
پنج شنبه 27 شهریور 1382, 17:05 عصر
1) با FindWindow هندل برنامه در حال اجرا بدست میاد.
2) با فرستادن مسیج WM_CLOSE به پنجره ای که هندلش رو بدست آوردی اونو ببند.

حالا دقیق میخوای چیکار کنی من که نفهمیدم مشکل شما کجاست.

SReza1
جمعه 28 شهریور 1382, 21:51 عصر
سلام دوستان
تنها چیزی که می دونم اسم برنامه Exe است که اجرا شده است! میخواستم اونو ببندم

Kambiz
جمعه 28 شهریور 1382, 22:47 عصر
حالا که یک چیزی از برنامه‌ای رو که می‌خوای ببندی رو گفتی می‌شه چیزی در جواب گفت. البته اگر گفته بودی که می‌خوای برنامه عادی بسته بشه یا اینکه در هر صورت اجراش رو قطع کنی بهتر بود. تو کد زیر که توضیحش رو قراره بدم فرض رو بر این گذاشتم که برنامه دیگه رو می‌خوای به طور عادی ببندی٬ به این معنا که مثلا اگر قرار 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)) = 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!');