Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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
7-54337
Selesty
2003-01-20 11:04
2003.03.17
EIP


1-54036
Monak
2003-03-04 23:39
2003.03.17
И просто проблема №2


14-54240
Supreme 2
2003-02-28 00:56
2003.03.17
Всех с наступающим 8 марта!


1-54006
Night $kull
2003-03-06 18:12
2003.03.17
Удаление компонента


7-54350
Dd
2003-01-22 20:44
2003.03.17
Кто нить знает как отключить...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский