TWebBrowser'da sağ click engelleme
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
TWebBrowser'da sağ click engelleme
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..
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..
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
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.
- 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

- 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
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..
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
@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.
- Bunların içince Point (Pt) dikkatimi çekti ve denemeye karar verdim. Sonuç tamam...
- 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
satırını aşağıdaki
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..
- 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
- 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.

Kod: Tümünü seç
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;

- 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)
Kod: Tümünü seç
if PtInRect(WebBrowser1.BoundsRect, ScreenToClient(Msg.pt))
- 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 son olayı inceleyip dene ve cevabını ver lütfen, tatmin edici mi

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 :
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;
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..
- 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ı...)
(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);
-
- Kıdemli Üye
- Mesajlar: 489
- Kayıt: 13 Eyl 2003 09:10
- Konum: istanbul
- İletişim:
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
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
@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.
Ana program bahsettiğiniz şekilde HTML üretir
Bu HTML sayfa içindeki <href> program dizinindeki yardımcı başka bir dosyayı gösterir
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.
Ana program tetiklenince , mevcut dizindeki bu Text dosyadan yeni SQL sorguyu okuyup bir Query'de sonuç döndürür ve HTML üretir.
Ü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...
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.





- 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...
Tekrar selam...
- Örnek vermeden internetten çıkmayım dedim...
Ana Programda formunuzun adı FormTetiklenecek olsun ve şöyle bir kod olsun....
Private kısmında ilk satıra şu tanımı ekleyin...
Sonra da bu tanımı fonksiyonel hale getirelim.
- 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...
Bunu siz
benzeri parametrelerle HTML içinden yazacaksınız.
Yardımcı Program önce parametreleri Parametre.TXT dosyası olarak kaydeder, sonra belirlenen Windows mesajını üretir ve yardımcı program kendini sonlandırır.
- Oluşacak Parametre.TXT içinde aşağıdakinin benzerini bulacaksınız.
- 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
- Örnek vermeden internetten çıkmayım dedim...
Ana Programda formunuzun adı FormTetiklenecek olsun ve şöyle bir kod olsun....

Kod: Tümünü seç
procedure OzelMesaj(var Msg : TMessage); message WM_USER+1;

Kod: Tümünü seç
procedure TFormTetiklenecek.OzelMesaj(var Msg : TMessage);
begin
ShowMessage('Programdan Mesaj Geldi');
end;
- 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
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'>

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;
Kod: Tümünü seç
c:\proje\yardimci.exe
query1
sirali
ismegore
ilkbes
- Hiç fena olmadı hani

-
- Kıdemli Üye
- Mesajlar: 489
- Kayıt: 13 Eyl 2003 09:10
- Konum: istanbul
- İletişim:
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....
(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....
-
- Kıdemli Üye
- Mesajlar: 489
- Kayıt: 13 Eyl 2003 09:10
- Konum: istanbul
- İletişim:
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
webbrowserin BeforeNavigate ile
söyle cıktı elde ediyorum
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....
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
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;
Kod: Tümünü seç
C:\Program Files\Borland\Delphi7\Projects\Akl_web_db\1=2
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....