Windows messagebox ındaki düğmelere tıklatabilmek
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Windows messagebox ındaki düğmelere tıklatabilmek
İyi akşamlar formda arştır bir yerde buldum sayın mrmarman ın yazmış olduğu bir konu ama örnek olmadığından anlayamadım.neyse konuya döneyim yapmak istediğim şey kendi programımdan bir tuşa tıklandığında windows messageboxlarındaki buttonların biine tıklayabilmek istiyorum.windowse programı ile baktım bu messagebox ların clas adları #32770 miş.örnek olarak bir not defterini kapatırken ekrana kaydedilsinmi diye soru çıkıyor ve evet hayır iptal diye üç adet buton çıkıyor.bunlardan örnek olarak hayırı tıklatmak istiyorum kendi programımdan buton1 e tıklayınca.bunu yapmak istiyorum.örnek bir kod veya anlatırsanız çok sevinirim.şimdiden teşekkür
Re: Windows messagebox ındaki düğmelere tıklatabilmek
Daha önce cevap yazdığım bir başlığa soru açmış, ben de örnekleyerek sor demiştim. Bu başlığı açtığını geç gördüm.
// Yapılacak işlem :
// - #32770 bizim dialog penceremiz... Birden fazla varsa
// bunların hangisinin bize ait olduğuna karar vericez..
// a- #32770'in Parentine bakınca 'NotePad' classname ile 'Note Defteri' görmeliyiz...
// b- Child'ına bakıldığındaki gördüğümüz classname 'DirectUIHWND' olmalı
// c- onun da Child'a bakıldığındaki gördüğümüz classname 'CtrlNotifySink' olmalı
// - Butonlarımızın parenti 'CtrlNotifySink' clasname olduğunu biliyoruz.
// - arayacağımız nedir ? handle nosunu bildiğimiz 'NotePad' ve
// yukarıdaki şartlara uyan ve
// 'CtrlNotifySink' olanların altındaki butonlar...
Sana bir fonksiyon hazırladım. İstediğin işlemi birebir yapıyor... İçine de açıklamaları detaylı bir şekilde yaptım.

Kullanımı şöyle.
// Yapılacak işlem :
// - #32770 bizim dialog penceremiz... Birden fazla varsa
// bunların hangisinin bize ait olduğuna karar vericez..
// a- #32770'in Parentine bakınca 'NotePad' classname ile 'Note Defteri' görmeliyiz...
// b- Child'ına bakıldığındaki gördüğümüz classname 'DirectUIHWND' olmalı
// c- onun da Child'a bakıldığındaki gördüğümüz classname 'CtrlNotifySink' olmalı
// - Butonlarımızın parenti 'CtrlNotifySink' clasname olduğunu biliyoruz.
// - arayacağımız nedir ? handle nosunu bildiğimiz 'NotePad' ve
// yukarıdaki şartlara uyan ve
// 'CtrlNotifySink' olanların altındaki butonlar...
Sana bir fonksiyon hazırladım. İstediğin işlemi birebir yapıyor... İçine de açıklamaları detaylı bir şekilde yaptım.

Kod: Tümünü seç
Function NotDefteriDialog( hNotDefteri:hwnd; BasilacakButtonIdx : Word ) : Word;
Var
DialogListesi : TStringList;
//hNotDefteri : hwnd;
hHand : hwnd;
hDialog : hwnd;
hButton : hwnd;
hDirectUIHWND : hwnd;
hCtrlNotifySink : hwnd;
i : integer;
ButtonSay : integer;
Bulduk : Boolean;
ClassName,
Title : array[0..255] of char;
begin
// Yapılacak işlem :
// - #32770 bizim dialog penceremiz... Birden fazla varsa
// bunların hangisinin bize ait olduğuna karar vericez..
// a- #32770'in Parentine bakınca 'NotePad' classname ile 'Note Defteri' görmeliyiz...
// b- Child'ına bakıldığındaki gördüğümüz classname 'DirectUIHWND' olmalı
// c- onun da Child'a bakıldığındaki gördüğümüz classname 'CtrlNotifySink' olmalı
// - Butonlarımızın parenti 'CtrlNotifySink' clasname olduğunu biliyoruz.
// - arayacağımız nedir ? handle nosunu bildiğimiz 'NotePad' ve
// yukarıdaki şartlara uyan ve
// 'CtrlNotifySink' olanların altındaki butonlar...
Result := 0;
DialogListesi := TStringList.Create;
// #32770 class listesini alıyoruz...
hHand := Application.Handle;
while hHand > 0 do begin
GetClassName (hHand, ClassName, 255);
if ClassName = '#32770'
then DialogListesi.Add( IntToStr(hHand) );
hHand := GetnextWindow(hHand, GW_HWNDNEXT);
end; // While
if DialogListesi.Count > 0 then
// #32770 class olan dialog penceresi yoksa boşa uğraşmayalım diye if koyduk...
begin
for i := 0 to DialogListesi.Count -1 do begin
hDialog := StrToInt(DialogListesi[i]);
if GetParent( hDialog ) = hNotDefteri then
begin // (a) Parenti hNotDefteri olan "Not Defteri" için diyalog bulduk.
hDirectUIHWND := FindWindowEX( hDialog, 0, PChar('DirectUIHWND'), Nil );
if hDirectUIHWND <> 0 then
begin // (b) Childreni "DirectUIHWND" sınıfınını bulduk.
hCtrlNotifySink := FindWindowEX( hDirectUIHWND, 0, PChar('CtrlNotifySink'), Nil );
if hCtrlNotifySink <> 0 then
begin // (c) onun da ilk Childreni "CtrlNotifySink" sınıfınını bulduk.
// şimdi yapacağımız işlem, 'CtrlNotifySink' sınıfından kaç tane varsa
// onların altında button olanını araştırmak...
Bulduk := False;
ButtonSay := 0;
while (NOT Bulduk) AND ( hCtrlNotifySink <> 0) do
begin
// önceki hCtrlNotifySink referans olarak verip,
// sonraki hCtrlNotifySink handle nosunu elde ediyoruz...
hCtrlNotifySink := FindWindowEX( hDirectUIHWND, hCtrlNotifySink, PChar('CtrlNotifySink'), Nil );
if hCtrlNotifySink <> 0 then
begin
hButton := 0;
hButton := FindWindowEx( hCtrlNotifySink, hButton, PChar('Button'), Nil );
if hButton <> 0 then
begin // bir tane button bulduk. bakalım o button bizim button mu ?
Inc(ButtonSay);
GetWindowText(hButton, Title ,255);
if ButtonSay = BasilacakButtonIdx then
begin // bizim butonmuş basmak için onay veya bunu kaldır direkt bassın... :)
if MessageDlg( '"'+Trim(Title)+'" butonuna basılacak devam edeyim mi ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes
then begin
// Butona basmak yerine yapacağın başka işlem de olabilirdi.
// ( Buttonun textini değiştirmek vs. )
SendMessage( hButton, BM_CLICK, 0, 0);
Bulduk := True;
Result := 1;
end else Result := 2;
end;
end;
end; // if hCtrlNotifySink <> 0 then
end; // while
end; // if hCtrlNotifySink <> 0 then
end; // if hDirectUIHWND <> 0 then
end; // if GetParent( hDialog ) = hNotDefteri then
end; // for i := 0 to DialogListesi.Count -1 do begin
end; // if DialogListesi.Count > 0 then
DialogListesi.Free;
end;
Kod: Tümünü seç
procedure TForm1.BitBtn2Click(Sender: TObject);
Var
hNotDefteri :hwnd;
begin
hNotDefteri := FindWindow( PChar('Notepad'), Nil );
// ulaşacağın not defterini senin belirttiğini varsayıp
// buradan fonksiyona parametre olarak veriyoruz.
case NotDefteriDialog( hNotDefteri, RadioGroup1.ItemIndex +1 ) of
0: MessageDlg( 'Herhangi bir diyalog penceresi bulunamadı', mtError, [mbOk], 0);
1: MessageDlg( 'Buttona başarıyla basıldı', mtInformation, [mbOk], 0);
2: MessageDlg( 'Vazgeçtiniz, basmadık ', mtInformation, [mbOk], 0);
end;
end;
- Dosya ekleri
-
- ButonaBasmak_SaveDialog_Notepad.rar
- Kaynak Kod ve EXE dosyası: Not Defteri Diyalog Penceresinden istediğiniz butona kendi programınızdan basılmasını sağlamak için örnek proje.
- (174.15 KiB) 133 kere indirildi
Re: Windows messagebox ındaki düğmelere tıklatabilmek
hocam harikasınız çok ama çok teşekkür ederim