TWebBrowser Alert Mesajları

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

TWebBrowser Alert Mesajları

Mesaj gönderen vkamadan »

Merhaba değerli üyeler ,
TWebBrowser ile açtığım bir sitede bazı durumlarda ekrana JS de alert deyimi kullanılarak açılmış mesaj kutuları geliyor, bu durumu anlayıp ilgili mesaja "TAMAM" tuşunu nasıl tıklarım.
İyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: TWebBrowser Alert Mesajları

Mesaj gönderen SimaWB »

Burada Timer kullanarak periyodik olarak kontrol etmiş. Çok da profesyonel bir çözüm gibi gözükmüyor.
Burada ise alarm mesajının açılmasını engellemeyi göstermiş.
There's no place like 127.0.0.1
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: TWebBrowser Alert Mesajları

Mesaj gönderen vkamadan »

@SimaWB cevabın için teşekkür ederim, ilk yöntem ekrana mesajın çıktığını anlayıp kapatmak için işe yarıyor fakat , sorumda belirtmemişim mesajın içinde yazan bilgiyide okumanın bir yolu mümkün olabilir mi?
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: TWebBrowser Alert Mesajları

Mesaj gönderen SimaWB »

Biraz uğraştırdı ama oldu sanırım :)

Kod: Tümünü seç

function FindControlByNumber(hApp: HWND; ControlClassName: string; ControlNr: Word = 1): HWND;
var
  i: Word;
  hControl: HWND;
begin
  Result := 0;
  if IsWindow(hApp) then
  begin
    Dec(ControlNr);
    hControl := 0;
    for i := 0 to ControlNr do
    begin
      hControl := FindWindowEx(hApp, hControl, PChar(ControlClassName), nil);
      if hControl = 0 then
        Exit;
    end;
  end;
  Result := hControl;
end;

procedure TForm3.Timer1Timer(Sender: TObject);
const
  TargetCaption = 'Web sayfasından ileti';
var
  S: string;
  len: integer;
  hLable: HWND;
begin
  SetLength(S, 127);
  len := GetWindowText(GetForegroundWindow, PChar(S), 127);
  if len = 0 then Exit;
  SetLength(S, len);
  if S = TargetCaption then
  begin
    hLable := FindControlByNumber(GetForegroundWindow, 'Static', 2);//JS alertin mesaj içeriğinin class'ı Static ve 2. sırada.
    if hLable <> 0 then
    begin
      len := GetWindowText(hLable, PChar(S), 127);
      SetLength(S, len);
      Caption := S; //S alert box'ın mesaj içeriği
    end;
    Timer1.Enabled := False;
  end;
end;
There's no place like 127.0.0.1
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: TWebBrowser Alert Mesajları

Mesaj gönderen vkamadan »

@SimaWb emeğine sağlık ,
sorunsuz bir şekilde çalışıyor, alert in içeriğini alabilir.
Teşekkür ederim.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: TWebBrowser Alert Mesajları

Mesaj gönderen vkamadan »

Peki şöyle bir şeye daha ihtiyaç doğdu ,
şimdi yukarıdaki örnekte aktif pencerenin caption u okunup içine ulaşılıyor, o an bir şekilde başka bir uygulama penceresi aktif olursa kod çalışmıyor, bu kodun aktif olmasada dahi benim uygulamam daki webbrowserin verdiği bir alert mesajına ulaşmanın bir yolu var mı ?
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: TWebBrowser Alert Mesajları

Mesaj gönderen SimaWB »

Senin de bildiğin gibi örnek kodda GetForegroundWindow ile pencerenin Handle'ına ulaşılmış. Başka pencere aktif olunca tabiki onun handle'ı döndüğü için hiç bir zaman "if S = TargetCaption then" koşulu sağlanmıyor tahminin. Bence EnumWindows'u kullanarak tüm pencerelerin handle'larını sırasıyla kullanıp sonuca gidebilirsin.
Not: Aktif pencerede web browser kullanılıyor yada aktif pencere Internet Explorer'sa ve oradan Alert ile mesaj çıkmışsa işte o zaman senin uygulama bunu kendi mesajı zannedip işlem yapacaktır. Bu durumda problem nasıl çözülür bilemiyorum :?
There's no place like 127.0.0.1
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: TWebBrowser Alert Mesajları

Mesaj gönderen vkamadan »

@SimaWB ,

bahsetmiş olduğun EnumWindows apisiyle http://www.delphiforfun.org/programs/de ... indows.htm linkteki örnekten yola çıkarak o an aktif uygulamaların ve açtıkları mesajların en üstte olanlarının pencerelerine ulaşabildim, teşekkür ederim.
Volkan KAMADAN
www.polisoft.com.tr
mehmetantalya
Üye
Mesajlar: 189
Kayıt: 30 Eyl 2013 10:17

Re: TWebBrowser Alert Mesajları

Mesaj gönderen mehmetantalya »

Merhabalar,
Mesaj penceresini buluyor ama bir turlu kapattiramadim :S

Kod: Tümünü seç

var
  S: string;
  len: integer;
  hLable: HWND;
begin
  SetLength(S, 127);
  len := GetWindowText(Application.ActiveFormHandle, PChar(S), 127);
  if len = 0 then Exit;
  SetLength(S, len);
  if S = TargetCaption then
   begin
   hLable := FindControlByNumber(GetForegroundWindow, 'Static', 2);//JS alertin mesaj içeriğinin class'ı Static ve 2. sırada.
    if hLable <> 0 then
    begin
      len := GetWindowText(Application.ActiveFormHandle, PChar(S), 127);
      SetLength(S, len);
    end;

   SendMessage(hLable, WM_COMMAND, ID_OK, 0);
   end;
mehmetantalya
Üye
Mesajlar: 189
Kayıt: 30 Eyl 2013 10:17

Re: TWebBrowser Alert Mesajları

Mesaj gönderen mehmetantalya »

Kod: Tümünü seç

const
          Messagefromwebpage = 'Web sayfasından ileti';

       var
          wnd: hWnd;

    begin
          wnd := FindWindow(nil, Messagefromwebpage);
          if wnd <> 0 then
          begin
                PostMessage (Wnd, WM_CLOSE, 0, 0);
    
          end;
Bu Çalıştı. Sadece Mesajın icerigini almak kaldi. Onu henuz yapamadim.
Metin içerigini alirken

Kod: Tümünü seç

                  hLable := FindControlByNumber(GetForegroundWindow, 'Static', 2);//JS alertin mesaj içeriğinin class'ı Static ve 2. sırada.
                  if hLable <> 0 then
                  begin
Bu kismi geciyor.

Kod: Tümünü seç

  len := GetWindowText(hLable, PChar(S), 127);
Buraya gelince access violation .... seklinde adres hatasi veriyor.
Cevapla