Windows messagebox ındaki düğmelere tıklatabilmek

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
igny
Üye
Mesajlar: 54
Kayıt: 14 Mar 2008 04:03

Windows messagebox ındaki düğmelere tıklatabilmek

Mesaj gönderen igny »

İ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
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Windows messagebox ındaki düğmelere tıklatabilmek

Mesaj gönderen mrmarman »

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.

Resim

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;
Kullanımı şöyle.

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
Resim
Resim ....Resim
Kullanıcı avatarı
igny
Üye
Mesajlar: 54
Kayıt: 14 Mar 2008 04:03

Re: Windows messagebox ındaki düğmelere tıklatabilmek

Mesaj gönderen igny »

hocam harikasınız çok ama çok teşekkür ederim
Cevapla