PDA

View Full Version : بستن پنجره با استفاده از کپشن



Mask
سه شنبه 04 اسفند 1388, 00:24 صبح
با سلام
بنده یه برنامه نوشتم که با استفاده از این برنامه می تونم مثلا اگر خواستم پنجره My Computer باز شد رو ببندم.
نمی دونم چرا کد من از کار افتاده.
اگه ممکنه دوستان برنامه رو ببینند و دلیلشو بفرمان.
ممنون.

Mahmood_M
سه شنبه 04 اسفند 1388, 01:47 صبح
من تست کردم مشکلی نداشت ، مثلا برنامه ی FireFox رو باهاش بستم ، کد هم مشکلی نداره ...

...

Mask
سه شنبه 04 اسفند 1388, 03:24 صبح
من تست کردم مشکلی نداشت ، مثلا برنامه ی FireFox رو باهاش بستم ، کد هم مشکلی نداره ...

...
آقا محمود کارت درسته...
گفتم که پنجره هایی مثل My Computer رو می خام ببندم.
عزیز جان.

Felony
سه شنبه 04 اسفند 1388, 04:41 صبح
آقا محمود کارت درسته...
گفتم که پنجره هایی مثل My Computer رو می خام ببندم.
عزیز جان.

درست کار میکنه و پنجره هایی مثل My Computer رو هم میبنده ، کدی که نوشتید چیز خاصی نداره که مشکل ساز بشه ، اسم یه پنجره رو میگیره و دنبالش میگرده ، اگر پنجره ای با این عنوان وجود داشت پیغام بسته شدن رو بهش صادر میکنه .

شاید از XP به 7 سویئچ کردید ؟ تو 7 چیزی به نام My Computer نداریم و این گزینه به Computer تغییر کرده .

کدتون رو هم یکم تغییر دادم چون بهتره که از پیدا شدن پنجره و انجام عملیات مطمئن بشید :

Function CloseWin(WinCap:Pchar): Boolean;
var
wnd:Hwnd;
begin
wnd:=FindWindow(nil,WinCap);
if wnd<>0 then
begin
SendMessage(wnd,WM_CLOSE,0,0);
Result:= True;
end else
Result:= False;
end;

این هم یک نمونه از نحوه استفاده تابع :

if CloseWin(pchar(Edit1.Text)) then
ShowMessage('Window finded && close')
else
ShowMessage('Can not find window');
end;

یه راه دیگه برای انجام کار مورد نظر شما :

Function FindWindowByTitle(WindowTitle: string): Hwnd;
var
NextHandle: Hwnd;
NextTitle: array[0..260] of char;
begin
NextHandle := GetWindow(Application.Handle, GW_HWNDFIRST);
while NextHandle > 0 do
begin
GetWindowText(NextHandle, NextTitle, 255);
if Pos(WindowTitle, StrPas(NextTitle)) <> 0 then
begin
Result := NextHandle;
Exit;
end
else
NextHandle := GetWindow(NextHandle, GW_HWNDNEXT);
end;
Result := 0;
end;

استفاده :

SendMessage(FindWindowByTitle('Computer'),WM_Close ,0,0);

DAMAVAND
سه شنبه 04 اسفند 1388, 05:35 صبح
کدي که که نوشتيد همون طوري که دوستان گفتند درست هست و مشکلي نداره. ولي براي بستن يک پنجره بهتره از تابع Postmessage استفاده کنيد. Sendmessage در در مورد ارسال پيام WM_CLOSE در بعضي مواقع درست کار نميکنه ! به همين خاطر شايد کدتون ديگه کار نميکنه ......
در ظاهر دو تابع PostMessage and SendMessage فرق اساسي باهم ندارن . SendMessage يک پيام رو به صف پيام هاي ويندوز ميفرسته و منتظر پاسخ مي مونه, ولي يک PostMessage پيام رو ارسال ميکنه و ديگه منتظر پاسخ نميشه. در ظاهر فرق اساسي نيست ولي تجربه ميگه براي بستن پنجره و ارسال پيام WM_CLOSE از تابع PostMessage استفاده کنيد که هميشه جواب ميده.

Mask
چهارشنبه 05 اسفند 1388, 00:54 صبح
ممنون از دوستان
آقا مجتبی کد شما هم جواب نداد و وقتی روی دکمه مورد نظر کلیک می کردم جهت بستن My Computer این پنجره رو پیدا می کرد اما نمی تونست ببندتش و هی صدای دینگ میداد از اسپیکر.
اما با تغییر Sendmessage به PostMessage برنامه درست شد.
وتشکر فراوان دارم از دوست خوبم damavand.
میشه بیشتر در مورد این دو دستور توضیح بدید؟
با تشکر.

Felony
چهارشنبه 05 اسفند 1388, 07:32 صبح
هر پروسه و برنامه در ویندوز دارای یک صف پیغام هست که هر پیغامی که به اون برنامه از طرف برنامه ها دیگه یا ویندوز یا ... میرسه در این صف به ترتیب قرار میگیره ( همه جا به نوبت :لبخند: ) برنامه به ترتیب اولیت در صف به پیغام ها جواب میده و یا درخواست هاشون رو انجام میده ، وقتی با تابع SendMessage پیغام رو میفرستید پیغام به صف فرستاده میشه برنامه ما که به وسیله اون پیغام رو فرستادیم منتظر تأييديه از طرف برنامه مقصد میمونه ، برنامه وقتی به پیغام ارسالی از طرف ما رسید تأييديه رو صادر برای برنامه ما صادر میکنه ، در این صورت برنامه ما مطمئن میشه که پیغام حتما بررسی شده ولی وقتی با تابع PostMessage یک پیغام رو ارسال میکنید ، پیغام به صف پیغامها برنامه مقصد فرستاده میشه ولی برنامه منتظر تأييديه نمیونه و ادامه کارش رو انجام میده بدون اینکه تأييديه بگیره و مطمئن بشه که پیغام ارسالی از طرف ما بررسی شده .