Форум: "Система";
Текущий архив: 2003.03.17;
Скачать: [xml.tar.bz2];
ВнизНе могу перехватить WM_CONTEXTMENU в TWebBrowser Найти похожие ветки
← →
Роман Фадеев (2002-12-09 17:42) [0]Добрый день. Я использую компоненту TWebBrowser. Встала проблема избаиться от стандарного Popup-меню эксплорера. Попробовал использовать свой popup-меню (у компонента свойство popupmenu открыто) - не работает. Вызывается стандартное меню. Попробовал наследовать TWebBrowser и в своем классе перекрывать WndProc - бесполезно. Приходит все, что угодно, кроме событий мыши и WM_CONTEXTMENU.
Вопрос стандартен: что делать? (я уже не спрашиваю, кто виноват :))
Версия IE - 6.0
← →
kig (2002-12-09 23:13) [1]Посмотреть в MSDN что такое WebBrowser Customization
(особенно IDocHostUIHandler)
IDocHostUIHandler::ShowContextMenu Method
--------------------------------------------------------------------------------
Called by MSHTML to display a shortcut menu.
Syntax
HRESULT ShowContextMenu( DWORD dwID,
POINT* ppt,
IUnknown* pcmdtReserved,
IDispatch* pdispReserved
);
Parameters
dwID
[in] DWORD that specifies the identifier of the shortcut menu to be displayed. This identifier is a bitwise shift of the value 0x1 by the shortcut menu values (e.g., CONTEXT_MENU_DEFAULT) defined in Mshtmhst.h.
0x2
value of (0x1 << CONTEXT_MENU_DEFAULT)
0x4
value of (0x1 << CONTEXT_MENU_CONTROL)
0x8
value of (0x1 << CONTEXT_MENU_TABLE)
0x10
value of (0x1 << CONTEXT_MENU_TEXTSELECT)
0x30
value of (0x1 << CONTEXT_MENU_ANCHOR)
0x20
value of (0x1 << CONTEXT_MENU_UNKNOWN)
ppt
[in] Pointer to a POINT structure containing the screen coordinates for the menu.
pcmdtReserved
[in] Pointer to the IUnknown of an IOleCommandTarget interface used to query command status and execute commands on this object.
pdispReserved
[in] Pointer to an IDispatch interface of the object at the screen coordinates specified in ppt. This allows a host to differentiate particular objects to provide more specific context.
Return Value
Returns one of the following values:
S_OK Host displayed its own user interface (UI). MSHTML will not attempt to display its UI.
S_FALSE Host did not display any UI. MSHTML will display its UI.
DOCHOST_E_UNKNOWN Menu identifier is unknown. MSHTML may attempt an alternative identifier from a previous version.
← →
Song (2002-12-10 08:18) [2]И не получится у Вас перехватить WM_CONTEXTMENU, оно не генерируется.
Перехватывайте правую кнопку.
← →
Tano (2002-12-10 23:39) [3]Перехват меню (ТОЛЬКО БЛОКИРОВКА). У меня работает:
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.
Подсмотрено на этом форуме.
← →
int64 (2002-12-10 23:53) [4]Бери компонент: TEmbeddedWB = class (TWebBrowser)
У него есть свойство OnShowContextMenu. Если просмотреть исходники то, будет то, что kig © (09.12.02 23:13) написал.
См. сюда:
http://www.euromind.com/iedelphi/embeddedwb/onshowcontextmenu.htm
А перехватывать правую кнопку, как минимум, некрасиво. :)
← →
Rouse_ (2002-12-11 00:59) [5]Предлагаю свой вариант, взято с Королевства, но немного переделано из-за глюкавости:
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.
Желаю успехов
← →
Rouse_ (2002-12-11 01:36) [6]Эээ немного забылся, для использования достаточно подключить юнит в Uses и все (Исправлены глюки которые досаждали мне)
Желаю успехов
PS: Если есть ошибки в коде, плз сообщите по мылу
← →
_none_ (2003-01-20 18:08) [7]есть способ лучше и проще: http://emanual.ru/download/951.html
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2003.03.17;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c