TWebBrowser'da sağ click engelleme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
beginer
Üye
Mesajlar: 16
Kayıt: 27 Oca 2004 01:40

TWebBrowser'da sağ click engelleme

Mesaj gönderen beginer »

form içerisine bir tane TWebBrowser nesnesi koydum.ve bu form üzerinde
gelecek web sayfasında sağ click olayını engellemek istiyorum..daha önce
MouseProc adında bir fonksiyon kullandım..ama Win98 ve Win ME sistemlerde
KRNL386.EXE hatası verdi..
yardımcı olursanız sevinirim..teşekkürler..
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Selamlar...

- Windows'ta yaptığınız her işlem, buna mouse hareketleri, bastığınız tuşlar dahil; windows tarafından mesaj oluşturulurak ilgili forma ulaştırılır.

- Windows Mesaj Sistemi hakkında bilgi için yine forumda sorgulama yaptırın, bilgi bulabilirsiniz...

- OnMouseDown olayını bir kaç yöntemle kontrol altına alabiliriz. En kestirme yöntem, forma ekleyeceğiniz Additional paletindeki ApplicatiponEvent Resim nesnesidir...

- Bu nesnenin Events'lerinden OnMessage eventini kullanıcaz. Application (yazdığınız program) sınırları içindeki oluşan Windows mesajlarını, yani bileşenlerde (sizdeki TWebBrowser1 vb.) oluşan mesajları yakalyıp, ApplicationEvent nesnesinin OnMessage eventinde sorguluycaz.

- İlk olarak SağMouse tuşunun tıklanıp tıklanmadığını, sonra da bu tıklamanın nerde yapıldığını aramak şeklinde bir yöntem izleyeceksiniz.

- Aşağıdaki örnekte Msg.Message sağ button click olup olmadığına bakar, sonra da Msg.HWND değerinin bileşeninizinki mi olduğunu sorgulayarak, bu mesajın orada mı gerçekleştiğini öğrenirsiniz.

Kod: Tümünü seç

  Case Msg.message Of
  WM_RBUTTONDOWN,
  WM_RBUTTONDBLCLK :
      begin
        If (WebBrowser1.Handle = Msg.HWND)
        then
        begin
          Showmessage('WebBrowser1''den sağ mouse tıklaması tespit edildi...');
        end;
      end;
   end; // Case
Resim
Resim ....Resim
beginer
Üye
Mesajlar: 16
Kayıt: 27 Oca 2004 01:40

Mesaj gönderen beginer »

sizin verdiğiniz kodu TForm1.ApplicationEvents1Message de denedim..programı çalıştırdım ancak sağ click olayını ne engelliyor ne de ekrana sizin verdiğiniz kodda showmessage içindeki mesaj ekrana geliyor.dediklerinizden de pek bişey anlamadım doğrusu..zaten üst düzey delphi kullanıcısı değilim..daha tatmin edici bir cevap olursa iyi olur..
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Selam...

- Peki o zaman soracağım şu soruları cevaplayın.. sonucu test edelim...

1. ApplicationEvents1Message'a bu kodu birebir kopyala yapıştır yaptınız mı ?

2. Sağ mouse tuşu engellenecek WebBrowser'inizin adı nedir ?
- Gönderdiğim kodda WebBrowser1 yazan yere sizdeki bu adı yazdınız mı ?
Resim
Resim ....Resim
beginer
Üye
Mesajlar: 16
Kayıt: 27 Oca 2004 01:40

Mesaj gönderen beginer »

Kod: Tümünü seç

Case Msg.message Of 
  WM_RBUTTONDOWN, 
  WM_RBUTTONDBLCLK : 
      begin 
        If (WebBrowser1.Handle = Msg.HWND) 
        then 
        begin 
          Showmessage('WebBrowser1''den sağ mouse tıklaması tespit edildi...'); 
        end; 
      end; 
   end; // Case
formun oncreate olayında WebBrowser1.Navigate('www.google.com'); dediğimde showmessage içindeki mesaj ekrana gelmiyor..ayrıca ben WebBrowser içinde sağ click yapılmasını engellemek istiyorum..
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@beginner Selam.

- Problemin kaynağına gidildiğinde şu sonuç ortaya çıktı...

- WebBrowser ile herhangi bir sayfa çağrılmaksızın üzerinde sağ mouse tuşuna basıldığında dönen Mesaj handle numarası sabit iken, herhangi bir sayfa çağrıldığında (navigate edildiğinde) dönen mesaj handle değişken oluyor. Problem de burdan kaynaklanıyor.

- Delphi ile program yazmak insanın ufukunu geniş tutuyor, her zaman bir alternatifin var olduğunu düşünerek Msg parametrelerine bir göz atmak için Delphi'nin help'ine bakınca şunları gördüm. :idea:

Kod: Tümünü seç

    HWND   hwnd;	 
    UINT   message; 
    WPARAM wParam; 
    LPARAM lParam; 
    DWORD  time; 
    POINT  pt; 
- Bunların içince Point (Pt) dikkatimi çekti ve denemeye karar verdim. Sonuç tamam... :lol:

- Biz bu değişken handle numarası ile uğraşmaktansa, WebBrowser üzerindeyken tıklanan mouse koordinatlarını okuyabiliyoruz... :) :) :)

- PtInRect fonksiyonu da bize bir point'in (nokta), istenen bir rect (dikdörtgen) içinde olup olmadığına bakıp Ture veya False döndürdüğüne göre...

- Burdan yola çıkarak daha önce yazdığım

Kod: Tümünü seç

If (WebBrowser1.Handle = Msg.HWND) 
satırını aşağıdaki

Kod: Tümünü seç

if PtInRect(WebBrowser1.BoundsRect, ScreenToClient(Msg.pt))
satırı ile değiştirince, gelen mesaj tipinyle yapılan karşılaştırmayı bıraktık, yerine bu mesaj hangi koordinatlarda ona bakmış olduk.

- Bu arada parametreler içinde Handled diye boolean tipli bir değişken göreceksin. Bunun görevi, mesajın yerine ulaştığını belgelemektir. Yani gereği görüldü anlamında.

- Ekrana kendin de dahil hiç mesaj gelmesin istersen, senin ShowMessage yazan satırı silip, şu satırı yaz..

Kod: Tümünü seç

           Handled := true;
- Bu şekilde WebBrowser'a herhangi bir sağmouse hareketi ulaşamayacaktır.

- Bu son olayı inceleyip dene ve cevabını ver lütfen, tatmin edici mi :?:
Resim
Resim ....Resim
beginer
Üye
Mesajlar: 16
Kayıt: 27 Oca 2004 01:40

Mesaj gönderen beginer »

WebBrowser nesnesi içindeki web sayfasında sağ tıklamayı engelleme

forma bir adet TWebBrowser ve Additional sekmesinde bulunan ApplicationEvents bileşeni koyun. ApplicationEvents bileşeninin OnMessage olayına şu kodu yazın :

Kod: Tümünü seç

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  Case Msg.message Of 
  WM_RBUTTONDOWN, 
  WM_RBUTTONDBLCLK : 
      begin 
        if PtInRect(WebBrowser1.BoundsRect, ScreenToClient(Msg.pt))
        then 
        begin
          Handled := true;
          //Showmessage('WebBrowser1''den sağ mouse tıklaması tespit edildi...');
        end; 
      end;
   end; // Caseend;
end;
beginer
Üye
Mesajlar: 16
Kayıt: 27 Oca 2004 01:40

Mesaj gönderen beginer »

yukarıdaki kodla ilgili ek olarak sağ tıklandığında popup menü gelsin istiyorum.properties den formun ve webbrowser bileşeninin popupmenu özellikerine popupmenu1 i atadım..ancak, bu kodda Handled := true; satırını kaldırınca, sayfada sağ click yapıldığında internet explorer ın kendi menüsü geliyor..bu satırı kaldırmayıp sağ click yaptığımda ise ekrana hiçbirşey gelmiyor..yardımcı olursanız sevinirim..
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Bu taktirde gereği görüldü/yerine getirildi mesajı olan Handled satırını takiben, zaten koordinatlarını bildiğimiz yerde istediğin PopUp Menu'yü açtırır işleme devam edersin...
(Hatırlarsan Msg.Pt içerisinde mouse tıklanan koordinat vardı...)

Kod: Tümünü seç

           Handled := true;
           PopUpMenu1.Popup(Msg.pt.x, Msg.pt.y);
Resim
Resim ....Resim
abdulkadir
Kıdemli Üye
Mesajlar: 489
Kayıt: 13 Eyl 2003 09:10
Konum: istanbul
İletişim:

Mesaj gönderen abdulkadir »

mehabalar

konu ile alakası yok ama TWebBrowser ile ilgi bir sorum var

databasedeki bilgileri Query ile okuyor cıktıyı html sayfası olarak kaydediyorum
ve webbrowsere ile acıyorum

bu acılan html sayfasındaki linkler ile
link url si ne göre

link 1 Query1
link 2 Query2
link 3 Query3 ü vs calıstırmak istiyorum

biraz denemeler yaptım ama olmadı.

bu aralar evden internete baglanamadıgım için
cafe ler le idare ediyorum
bu yüzden kaynak kodu yazamadım

yardımcı olabilirseniz tesekkür ederim
sevgiler saygılar
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@abdulkadir
Selam...

- Çok değişik bir proje... Makineniz WebServer olsaydı, Web Request alacak yardımcı bir program yazıp, link ve parametre gönderdiğiniz bu alt programdan yine HTML sonuçların alınması sağlanabilirdi. Klasik Asp sorgu mantığı

- Ama başlama noktası olarak fena değil bence. Üretilen HTML sayfanın Windows Mesaj sisteminde bir mesaj üreterek parametre aktarımını sağlayan (parametreleri mesajla değil, ana programdaki webbrowser'i local bir yere navigasyon için tetiklemek şeklinde) bir alt program yazabilirsiniz.

:arrow: Ana program bahsettiğiniz şekilde HTML üretir
:arrow: Bu HTML sayfa içindeki <href> program dizinindeki yardımcı başka bir dosyayı gösterir
:arrow: Bu dosya istenen sorgu için SQL sorgu oluşturarak, program dizininde bir text dosya olarak kaydeder. Sonra da bir Windows Mesajı üreterek Ana Programınızdan bu üretilen mesaj ile tetiklenmesi sağlanır.
:arrow: Ana program tetiklenince , mevcut dizindeki bu Text dosyadan yeni SQL sorguyu okuyup bir Query'de sonuç döndürür ve HTML üretir.
:arrow: Üretilen bu HTML, WebBrowser tarafından navigate edilir....

- Bu karmaşık gibi görünen basit bir döngü aslında.. Sağ kulağı soldan göstermek gibi ama amaca ulaşmak için bir yöntem....

- Daha kısa bir yöntem aklıma gelirse mutlaka yazarım...
Resim
Resim ....Resim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Tekrar selam...

- Örnek vermeden internetten çıkmayım dedim...

Ana Programda formunuzun adı FormTetiklenecek olsun ve şöyle bir kod olsun....

:arrow: Private kısmında ilk satıra şu tanımı ekleyin...

Kod: Tümünü seç

    procedure OzelMesaj(var Msg : TMessage); message WM_USER+1;
:arrow: Sonra da bu tanımı fonksiyonel hale getirelim.

Kod: Tümünü seç

procedure TFormTetiklenecek.OzelMesaj(var Msg : TMessage);
begin
  ShowMessage('Programdan Mesaj Geldi');
end;
- Yazacağınız Yardımcı Program, hani <href> edilecek program da şu kodları içersin. Amaç sadece ana programı tetiklemek...

- Kullanımı ise kendi terminolojinizi kurun... örnek olsun diye ben sirali, Query1, ismegöre, ilkbes dedim...

Kod: Tümünü seç

Yardimci.EXE Query1 sirali ismegore ilkbes
Bunu siz

Kod: Tümünü seç

<href='c:\proje\yardimci.exe query1 sirali ismegore ilkbes' title='Query1'> 

Kod: Tümünü seç

<href='c:\proje\yardimci.exe query1 sirali yasagore hepsi' title='Query2'> 
benzeri parametrelerle HTML içinden yazacaksınız.

:arrow: Yardımcı Program önce parametreleri Parametre.TXT dosyası olarak kaydeder, sonra belirlenen Windows mesajını üretir ve yardımcı program kendini sonlandırır.

Kod: Tümünü seç

procedure TForm1.FormCreate(Sender: TObject);
Var
  Numara    : THandle;
  Parametre : TStringList;
  Sayac     : Integer;
begin
  Parametre := TStringList.Create;
  For Sayac := 0 to ParamCount-1 do Parametre.Add(ParamStr(Sayac));
  Parametre.SaveToFile(ExtractFilePath(Application.ExeName)+'Parametre.TXT');
  Parametre.Free;

  Numara := FindWindow(Nil, 'FormTetiklenecek');
  PostMessage(Numara, WM_USER+1, 0, 0);
  Application.Terminate;
end;
- Oluşacak Parametre.TXT içinde aşağıdakinin benzerini bulacaksınız.

Kod: Tümünü seç

c:\proje\yardimci.exe
query1 
sirali 
ismegore 
ilkbes
- Sizin daha yukarda yazdığım Ana Program mesaj tetikleme procedure'nde ShowMessage satırının yerine yapılması gereken şey, ilgili Query'yi bu text dosyaya göre güncelleyip HTML export edip tekrar WebBrowser ile navigate etmek...

- Hiç fena olmadı hani :)
Resim
Resim ....Resim
abdulkadir
Kıdemli Üye
Mesajlar: 489
Kayıt: 13 Eyl 2003 09:10
Konum: istanbul
İletişim:

Mesaj gönderen abdulkadir »

Cevap için biraz gec oldu kusura bakmayın (Baglantı sorunu(halloldu))

Hocam öncelikle ilginize tesekkür ederim
Yazdıklarınızı Aksam deneyip cevap yazacagım

Ancak anlamadıgım yardımcı program

Ana.exe
Yardimci.exe

seklindemi 2 ayrı uygulamamı olacak
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Selam.

(gecikme konusunda hiç önemli değil, canınız sağolsun...)

Sorunuza gelince Doğrudur.... iki dosya olacak... Çünkü ana dosyanızı webserver olmadan çabucak tetiklemeniz nasıl olur aklıma başka bişey gelmedi. En fazla tarihi bir geçmişi olan Token (jeton) metodu var ki bu şimdi anlamsız kalıyor....

Token Metodu : HDD'de bir dosya saniyede bir kere kontrol edilir, bu dosya değişmişse içeriği okunurak değerlendirme yapılmak üzere işleme konur....
Resim
Resim ....Resim
abdulkadir
Kıdemli Üye
Mesajlar: 489
Kayıt: 13 Eyl 2003 09:10
Konum: istanbul
İletişim:

Mesaj gönderen abdulkadir »

Hocam merhaba

Bu aralar hızlı davranamıyorum kusura bakmayın lütfen malum iş falan

dediklerinizi aynen yaptım ölcüp bictikten sonra olmayacak kanısı olustu bende

link yardimci.exe iken browser bunu direk olarak indirmeye calısıyorki
bu normaldir pc server olsaydı yardımcı.exe nin chmod 777 yapardık ama degil

ben söyle bir yöntem kullanmayı düsünüyorum su an basladım ama sizinde fikriniz ve desteginiz olursa halledecm insaallah

linkler söyle olacak

Kod: Tümünü seç

<a href="1=2">

//bir (1) kategori id
//iki (2) icerik id

webbrowserin BeforeNavigate ile

Kod: Tümünü seç

procedure TForm1.WebBrowser1BeforeNavigate2(Sender: TObject;
  const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
  Headers: OleVariant; var Cancel: WordBool);
begin
Label1.caption:=URL;
end;
söyle cıktı elde ediyorum

Kod: Tümünü seç

C:\Program Files\Borland\Delphi7\Projects\Akl_web_db\1=2
bana burda sadece 1 ve 2 lazım

bunları yok etmeye calısıyorum
tabi 1 (0000000000) 10 adet herhangi bir rakam olabilir
ve aynı sekilde 2 de bu mantık

halledersem olay tamamdır

Ne dersiniz olmazmı bu iş
ben hemen baslıyorum kırpmaya
tabi yine fikir ve desteginize ihtiyacım olacak

sevgiler iyi calısmalar dilerim....
Cevapla