internet Explorer aşağıdaki buton 1'e tıkladığımda aktif hale geliyor, buton 2' ye tıkladığımda kullanıcı adı ve şifre girsin, buton 3'e tıkladığımda ise çıkış yaptırmak istiyorum, fakat bunu açmış olduğum aynı internet Explorer'e nasıl yaptıra bilirim...
procedure TForm2.Button1Click(Sender: TObject);
var
IEApp: OleVariant;
begin
if (VarIsEmpty(IEApp)) then
begin
IEApp := CreateOleObject('InternetExplorer.Application');
ShowWindow(IEApp.HWND, 3);
IEApp.Visible := True;
end;
IEApp.Navigate('https://www.facebook.com/');
end;
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Sistem şöyle kurulabilir. Edit1 ve Edit2 sizin isim ve şifre olsun.
Her butonda aynı tek IEApp çalışacağı için LOCAL (Yerel / Procedude içi) değil GLOBAL (Genel Kullanıma Açık) değişken yapmak gerekiyor.
Bunun için VAR bloğunu dışarıya almalısınız.
USES ComObj;
Var
xIEApp: OleVariant;
//Explorer Ekranı Hazırla
procedure TForm1.BitBtn1Click(Sender: TObject);
procedure Bekle( IEpp: OleVariant );
begin
while (IEpp.Busy) do
begin
Sleep(1);
Application.ProcessMessages;
end;
end;
begin
if (VarIsEmpty(xIEApp)) then
begin
xIEApp := CreateOleObject('InternetExplorer.Application');
ShowWindow(xIEApp.HWND, SW_SHOWMAXIMIZED);
xIEApp.Visible := True;
end;
xIEApp.Navigate('https://www.facebook.com/');
Bekle( xIEApp );
Showmessage( 'Facebook Hazır....');
end;
//LogIn
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
if NOT (VarIsEmpty(xIEApp)) then
begin
xIEApp.Document.GetElementByID('email').Value := Edit1.Text;
xIEApp.Document.GetElementByID('pass').Value := Edit2.Text;
xIEApp.Document.GetElementByID('loginbutton').Click;
end;
end;
//LogOut
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
if NOT (VarIsEmpty(xIEApp)) then
begin
xIEApp.Document.GetElementById('logout_form').Submit();
end;
end;
Sayın mrmarman verdiğiniz örneği IE de bu şekilde yapabiliyoruz peki Firefox,Chrome,Safari,Opera vs tarayıcılarda nasıl yapabiliriz bir uygulama kullanmıştım kullanıcı girişine bastığımda default browseri açıyordu üstelik açık olan tarayıcı üzerinden yeni sekme açarak yapıyordu giriş yaptıkdan sonra uygulama yakalayıp login işlemi yapmış oluyordu bu tür sistemlerde ne kullanılıyor acaba ?
Malesef browserlar, üretici firmanın kendi akreditasyonu olmayan projelerin evlerinde dolaşmasına razı olmuyorlar.
Örneğin google chrome için chromium, firefox için mozilla webapi vb. ile bu kadar derin gezintiye müsaade ediyor. WebBrowser dom desteği dahi explorer'dan geliyor. Android altında windows tarzı dom yapılı explorer olmadığından, dahi windows api zaten olmadığından orada bu yazılı yöntemler çalışmıyor.
Bir projede linkler arasında dolaşacaksanız kabul gören mantık; kullanıcıya yazılım sınırlarındaki browseri kullandırmaktır. Siz kullanıcıya uymaya gayret ederseniz bir yere kadar sempati alır, bir sonrasında yolda kalırsınız.
Tabii siyah şapkalı bir programcıysanız, hepsine her şekilde erişirsiniz. Javascript bilgisi yeterlir. İlgilendiğiniz hangi browser olursa olsun önce explorer ile açıp java inject edip, ürünü chrome ile navigate ettirirseniz kaleyi içten fetheder winapi gibi kullanabilirsiniz.
teşekkürler hocam dediklerinizden bir yol bulabildim fakat tam vakıf olamadım örneğin firefox chrome vs başka uygulamaların kendi webbrowser nesnesi üzerinde IE gibi tam hüküm sürdürmeye müsade etmiyor peki örnekte verdiğiniz gibi firefox veya chrome için comobje yaratarak aynı mantık üzerinden veya başka yolla DOM lara erişebilir miyiz.
Dediklerinize katılıyorum aynı işi yapıyorlar fakat kullanıcıların alışkanlıkları uygulamayı canlı tutmak için bir yerde önemli kimi IE den nefret eder açıldıgı an küfür bile edebilir bu yüzden bu benim tarafımca bir parça önemli birde arka plan kontrol Java ya ait herhangi bir yazılım yok sitede Java eklentisine dair bir bilgide yok uygulama da C++ ile yazılmış acaba hangi yollarla yapabilir.
Kullanıcı dostu bir uygulama yapıyorsan o explorer severek kullanılır. Sen exploreri eşşek yapıp sonuçları kendi formunda sunarsan kimse anlamaz.
Bir de login bilgilerini senin programa alıyor olman da ne kadar etik o tartışılır. Birisi derse ki login bilgilerim çalındı, aha şu program kullandıktan sonra oldu... Bu yaftayla kalırsın, 100 browsera destek de versen boş..
Hocam aydinlattiginiz icin tesekkur ederim. Login bilgilerini uygulamaya almakdan bahsettiniz ornegin ie ile login yaptirdik user bilgilerini almak elbette dogru degil peki login yaptiktan sonra islemlere devam etmek icin kullanilan evrensel veya sizin onerdiginiz algoritma var midir aklimda bir kactane var fakat uzerinde durulmasi lazim.
Tesekkurler
Login olmuş bir explorer bulmak findwindow ve findwindowex fonksiyonlarını araştır. Forumda sadece ben bile bir çok örnek yazdım.
Ancak konu bu değil ki sana aktaramamışım. Kişilerin özeline ait projeler etik olmadığını söyledim. Günümüzde botlar kadar tehlikeli yazılım türü yoktur.
Kendinize özel yaparsınız o başka. Facebook hesabı açarsınız kendi login bilgilerinizi kullanırsınız, kişilerin sizi arkadaş listesine almasını ister benzer duvarv yazılarına vb. siz de ulaşırsınız bu bir yere kadar kabul edilebilir. Çünkü kişi dilediği zaman sizi devre dışı bırakabilir.
CreateOleObject ile bir ole nesnesini sürekli oluşturma cihetine gitmek yerine; GetActiveOleObject ile varlığını kontrol edip, yok ise oluşturabilirsiniz. GetActiveOleObject çağrımı exception ile neticelenir ise, nesne yok demektir bu durumda CreateOleObject ile oluşturursunuz, aksi durumda; daha önce oluşturulmuş olan instance'ı elde etmiş olursunuz.
Haklı olabilirsiniz ama kullanıcı kullanmıyorsa zaten pencereyi kapatırdı diyerek tercihi bu yönde kullanmak şahsi fikrim daha (verimli demiyorum) mantıklı.
Aktif pencereyi kullanıcıya bırakmak gerek diye düşünüyorum. Ama şu yapılabilir, bizim projemiz kendi özel işi için kullanmışsa bunu bir yere not edip, o pencereye odaklı yineleme yapılabilir.
EK: Siz biliyorsunuz ama başlığı okuyanlar için; zaten örnekte de VarIsEmpty sorgusu projemiz henüz sonlanmamışsa daima aynı Instance ile çalışır.