Delphi World - Перехватить WM_CONTEXTMENU в TWebBrowser
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Перехватить WM_CONTEXTMENU в TWebBrowser
Звонок в офис провайдера интернет:
- Алло! Это интернет?
- Да, слушаем Вас!
- Соедините с www.yahoo.com.

Перехват меню (ТОЛЬКО БЛОКИРОВКА):


var
 HookID: THandle;

function MouseProc(nCode: Integer; wParam, lParam: Longint): Longint; stdcall; 
var 
 szClassName: array[0..255] of Char; 
const 
 ie_name = 'Internet Explorer_Server'; 
begin 
 case nCode < 0 of 
   True: 
     Result := CallNextHookEx(HookID, nCode, wParam, lParam) 
     else 
       case wParam of 
         WM_RBUTTONDOWN, 
         WM_RBUTTONUP: 
           begin 
             GetClassName(PMOUSEHOOKSTRUCT(lParam)^.HWND, szClassName, SizeOf(szClassName)); 
             if lstrcmp(@szClassName[0], @ie_name[1]) = 0 then 
               Result := HC_SKIP 
             else 
               Result := CallNextHookEx(HookID, nCode, wParam, lParam); 
           end 
           else 
             Result := CallNextHookEx(HookID, nCode, wParam, lParam); 
       end; 
 end; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
 HookID := SetWindowsHookEx(WH_MOUSE, MouseProc, 0, GetCurrentThreadId()); 
end; 

procedure TForm1.FormDestroy(Sender: TObject); 
begin 
 if HookID <> 0 then 
   UnHookWindowsHookEx(HookID); 
end; 

Здесь по замыслу автора меню подменяется своим, но у меня не сработало (почему, не  разбирался):

// Для преобразования кликов правой кнопкой в клики левой,  раскомментировать

// {$DEFINE __R_TO_L}

implementation

uses Windows,Controls,Messages,ShDocVw;

var
 HMouseHook:THandle;

function MouseProc(
   nCode: Integer;     // hook code
   WP: wParam; // message identifier
   LP: lParam  // mouse coordinates
  ):Integer;stdcall;
var MHS:TMOUSEHOOKSTRUCT;
   WC:TWinControl;
{$ifdef __R_TO_L}
   P:TPoint;
{$endif}
begin
 Result:=CallNextHookEx(HMouseHook,nCode,WP,LP);
 if nCode=HC_ACTION then
  begin
    MHS:=PMOUSEHOOKSTRUCT(LP)^;
    if ((WP=WM_RBUTTONDOWN) or (WP=WM_RBUTTONUP)) then
     begin
       WC:=FindVCLWindow(MHS.pt);
       if (WC is TWebBrowser) then
       begin
         Result:=1;
{$ifdef __R_TO_L}
         P:=WC.ScreenToClient(MHS.pt);
         if WP=WM_RBUTTONDOWN 
         then PostMessage(MHS.hwnd,WM_LBUTTONDOWN,0,P.x + P.y shl 16);
         
         if WP=WM_RBUTTONUP 
         then PostMessage(MHS.hwnd,WM_LBUTTONUP,0,P.x + P.y shl 16);
{$endif}
         if (TWebBrowser(WC).PopupMenu<>nil) and  (WP=WM_RBUTTONUP) then
          begin
           TWebBrowser(WC).PopupMenu.PopupComponent:=WC;
           TWebBrowser(WC).PopupMenu.Popup(MHS.pt.x,MHS.pt.y);
          end;
       end;
     end;
  end;
end;

initialization


HMouseHook:=SetWindowsHookEx(WH_MOUSE,@MouseProc,HInstance,GetCurrentThreadID);

finalization

 CloseHandle(HMouseHook);

end.

Предлагаю свой вариант, взято с Королевства, но немного переделано из-за глюкавости. Для использования достаточно подключить юнит в Uses и все (Исправлены глюки, которые досаждали)!


unit WbPopup;

interface

implementation

uses Windows,Controls,Messages,ShDocVw, Forms, frmMain;

var
 HMouseHook:THandle;
 Pop: Boolean;

function MouseProc(
   nCode: Integer;     // hook code
   WP: wParam; // message identifier
   LP: lParam  // mouse coordinates
  ):Integer;stdcall;
var MHS:TMOUSEHOOKSTRUCT;
   WC:TWinControl;
begin
 Result:=CallNextHookEx(HMouseHook,nCode,WP,LP);
 if nCode=HC_ACTION then
  begin
    MHS:=PMOUSEHOOKSTRUCT(LP)^;
    if ((WP=WM_RBUTTONDOWN) or (WP=WM_RBUTTONUP)) then
     begin
       WC:=FindVCLWindow(MHS.pt);
       if (WC is TWebBrowser) then
       begin
         Result:=1;
         if (TWebBrowser(WC).PopupMenu<>nil) and (WP=WM_RBUTTONUP) then
          begin
           if Pop then Exit;
           Pop := True;
           TWebBrowser(WC).PopupMenu.Popup(MHS.pt.x,MHS.pt.y);
           Pop := False;
          end;
       end;
     end;
  end;
end;

initialization


HMouseHook:=SetWindowsHookEx(WH_MOUSE,@MouseProc,HInstance,GetCurrentThreadID);

finalization
try
 UnhookWindowsHookEx(HMouseHook);
 Sleep(100);
 CloseHandle(HMouseHook);
except

end;
end.

Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования