View Full Version : بستن پنجره با استفاده از کپشن
  
Mask
سه شنبه 04 اسفند 1388, 01:24 صبح
با سلام
بنده یه برنامه نوشتم که با استفاده از این برنامه می تونم مثلا اگر خواستم پنجره My Computer باز شد رو ببندم.
نمی دونم چرا کد من از کار افتاده.
اگه ممکنه دوستان برنامه رو ببینند و دلیلشو بفرمان.
ممنون.
Mahmood_M
سه شنبه 04 اسفند 1388, 02:47 صبح
من تست کردم مشکلی نداشت ، مثلا برنامه ی FireFox رو باهاش بستم ، کد هم مشکلی نداره ...
...
Mask
سه شنبه 04 اسفند 1388, 04:24 صبح
من تست کردم مشکلی نداشت ، مثلا برنامه ی FireFox رو باهاش بستم ، کد هم مشکلی نداره ...
 
...
 آقا محمود کارت درسته...
گفتم که پنجره هایی مثل My Computer رو می خام ببندم.
عزیز جان.
Felony
سه شنبه 04 اسفند 1388, 05: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, 06:35 صبح
کدي که که نوشتيد همون طوري که دوستان گفتند درست هست و مشکلي نداره. ولي براي بستن يک پنجره بهتره از تابع Postmessage استفاده کنيد. Sendmessage در در مورد ارسال پيام WM_CLOSE در بعضي مواقع درست کار نميکنه ! به همين خاطر شايد کدتون ديگه کار نميکنه ......
در ظاهر دو تابع PostMessage and SendMessage فرق اساسي باهم ندارن . SendMessage يک پيام رو به صف پيام هاي ويندوز ميفرسته و منتظر پاسخ مي مونه, ولي  يک PostMessage پيام رو ارسال ميکنه و ديگه منتظر پاسخ نميشه. در ظاهر فرق اساسي نيست ولي تجربه ميگه براي بستن پنجره و ارسال پيام WM_CLOSE از تابع PostMessage استفاده کنيد که هميشه جواب ميده.
Mask
چهارشنبه 05 اسفند 1388, 01:54 صبح
ممنون از دوستان
آقا مجتبی کد شما هم جواب نداد و وقتی روی دکمه مورد نظر کلیک می کردم جهت بستن My Computer این پنجره رو پیدا می کرد اما نمی تونست ببندتش و هی صدای دینگ میداد از اسپیکر.
اما با تغییر  Sendmessage به PostMessage  برنامه درست شد.
 وتشکر فراوان دارم از دوست خوبم damavand.
میشه بیشتر در مورد این دو دستور توضیح بدید؟
با تشکر.
Felony
چهارشنبه 05 اسفند 1388, 08:32 صبح
هر پروسه و برنامه در ویندوز دارای یک صف پیغام هست که هر پیغامی که به اون برنامه از طرف برنامه ها دیگه یا ویندوز یا ... میرسه در این صف به ترتیب قرار میگیره ( همه جا به نوبت :لبخند: ) برنامه به ترتیب اولیت در صف به پیغام ها جواب میده و یا درخواست هاشون رو انجام میده ، وقتی با تابع SendMessage پیغام رو میفرستید پیغام به صف فرستاده میشه برنامه ما که به وسیله اون پیغام رو فرستادیم منتظر تأييديه از طرف برنامه مقصد میمونه ، برنامه وقتی به پیغام ارسالی از طرف ما رسید تأييديه رو صادر برای برنامه ما صادر میکنه ، در این صورت برنامه ما مطمئن میشه که پیغام حتما بررسی شده ولی وقتی با تابع PostMessage یک پیغام رو ارسال میکنید ، پیغام به صف پیغامها برنامه مقصد فرستاده میشه ولی برنامه منتظر تأييديه نمیونه و ادامه کارش رو انجام میده بدون اینکه تأييديه بگیره و مطمئن بشه که پیغام ارسالی از طرف ما بررسی شده .
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.