Rubrik: HTML/Internet/Netzwerk · WebBrowser | VB-Versionen: VB5, VB6 | 07.07.01 |
PopUp-Menü des WebBrowser-Controls abschalten Mittels Subclassing wird hier gezeigt, wie sich das PopUp-Menü des WebBrowser-Controls abschalten lässt. | ||
Autor: Dieter Otter | Bewertung: | Views: 18.220 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Das WebBrowser-Control lässt sich sehr leicht in eigene Anwendungen einbinden und auch anwenden. Lästig ist aber oftmals, daß das Standard PopUp-Menü angezeigt wird, wenn man mit der rechten Maustaste in das "Explorer-Fenster" klickt.
Der nachfolgende Tipp zeigt, wie man mittels Subclassing gezielt den Rechtsklick abfragen, und somit das Anzeigen des PopUp-Menüs abschalten kann.
Fügen Sie zunächst den nachfolgenden Code in ein Modul ein (keine Form)!
Option Explicit ' zunächst die benötigten Deklarationen Public Declare Function SetWindowsHookEx Lib "user32" _ Alias "SetWindowsHookExA" ( _ ByVal idHook As Long, _ ByVal lpfn As Long, _ ByVal hmod As Long, _ ByVal dwThreadId As Long) As Long Public Declare Function UnhookWindowsHookEx Lib "user32" ( _ ByVal hHook As Long) As Long Public Declare Function GetCurrentThreadId Lib "kernel32" () As Long Private Declare Function CallNextHookEx Lib "user32" ( _ ByVal hHook As Long, _ ByVal nCode As Long, _ ByVal wParam As Long, _ lparam As Any) As Long Private Declare Function GetClassName Lib "user32" _ Alias "GetClassNameA" ( _ ByVal hwnd As Long, _ ByVal lpClassName As String, _ ByVal nMaxCount As Long) As Long Public Const WM_RBUTTONUP = &H205 Public Const WH_MOUSE = 7 Public Type POINTAPI x As Long y As Long End Type Public Type MOUSEHOOKSTRUCT pt As POINTAPI hwnd As Long wHitTestCode As Long dwExtraInfo As Long End Type Public glbMausProc As Long ' Maus-Ereignisse abfangen Public Function wbMausProc(ByVal nCode As Long, _ ByVal wParam As Long, MOUSEHOOK As MOUSEHOOKSTRUCT) As Long Dim sBuffer As String Dim sClassName As String Dim Result As Long ' rechte Maustaste wird losgelassen With MOUSEHOOK If (nCode >= 0 And wParam = WM_RBUTTONUP) Then sBuffer = Space(255) ' Klassenname des Browser-Fensters sClassName = "Internet Explorer_Server" ' Klassennamen des Fensters ermitteln, in welchem ' der Mausklick erfolgte Result = GetClassName(.hwnd, sBuffer, Len(sBuffer)) If Result > 0 Then If Left$(sBuffer, Result) = sClassName Then ' Klick erfolgte im Browser-Fenster wbMausProc = 1 Exit Function End If End If End If End With ' Mausereignis "weiterleiten" wbMausProc = CallNextHookEx(glbMausProc, nCode, wParam, _ MOUSEHOOK) End Function
Und in den Codeteil der Form, welches das WebBrowser-Control enthält, fügen Sie dann nachfolgenden Code ein:
Option Explicit Private Sub Form_Load() ' Windows benachrichtigen, daß Maus-Ereignisse an "unsere" ' wbMausProc geleitet werden sollen glbMausProc = SetWindowsHookEx(WH_MOUSE, _ AddressOf wbMausProc, App.hInstance, _ GetCurrentThreadId) End Sub Private Sub Form_Unload(Cancel As Integer) ' "Nachrichten-Umleitung" wieder aufheben UnhookWindowsHookEx glbMausProc End Sub
Wie funktioniert's nun genau?
Wird die Form geladen, teilen wir dem System mit, daß alle Mausereignisse nicht an das betroffene Fenster direkt weitergeleitet werden sollen, sondern zunächst an "unsere" Prozedur wbMausProc. In dieser Prozedur wird, wenn die rechte Maustaste losgelassen wird, zunächst der Klassennamen des Fensters ermittelt, welches das Ereignis normalerweise erhält. Das Ereignis wird nur dann an den korrekten Empfänger (Fenster) weitergeleitet, wenn es sich bei dem ermittelten Klassenname nicht um "unser" WebBrowser-Control handelt (Klassenname Internet Explorer_Server. Somit erhält das "Explorer-Fenster" keine Nachricht beim Loslassen der rechten Maustaste und demzufolge wird dann auch nicht das Standard PopUp-Menü angezeigt.