Программный Ctrl+F
За ранее благодарствую...
Приветствую всех....Народ подскажите как в CppWebBrowser програмно вызвать диалог поиска, тоесть при нажатии кнопки фокусился CppWebBrowser и вылетало окошко поиска (Ctrl+F) для дальнейшего поика на странице........
За ранее благодарствую...
:D Эй я тут Kuliba Faq зырел может тебе падет?
Как у TWebBrowser (IE4 ActiveX) показать диалог Find?
Nomadic советует:
Диалог Find у IE4 сделан через JScript. Этот скрипт лежит в ресурсах mshtml.dll и зовется find.dlg. Вызывается через showHTMLDialog. Вся тонкость в передаче параметров (я немного упростил оригинальный find.dlg и передаю их через SafeArray а не через IDispatch). Вот основная часть кода:
--------------------------------------------------------------------------------
[...]
...
{$R HTMLdlg.res}
...
procedure TForm1.ToolButton1Click(Sender: TObject);
var Disp: IDispatch;
Doc: IHTMLDocument2;
Wnd: IHTMLWindow2;
hr: HResult;
hinstMSHTML: Longint;
pfnShowHTMLDialog: SHOWHTMLDIALOGFN;
szTemp: array [0..MAX_PATH-1] of Char;
bstr: array [0..MAX_PATH-1] of WideChar;
pmk: IMoniker;
varArgs, varReturn: OleVariant;
begin
Disp:=IE4.Document;
hr:=Disp.QueryInterface(IID_IHTMLDocument2, Doc);
Disp._Release;
if (hr=S_OK) then begin
hinstMSHTML:=LoadLibrary('MSHTML.DLL');
if (hinstMSHTML>0) then begin
pfnShowHTMLDialog:=GetProcAddress(hinstMSHTML, 'ShowHTMLDialog');
if Assigned(pfnShowHTMLDialog) then begin
StrCopy(szTemp, 'res://');
GetModuleFileName(hInstance, szTemp + lstrlen(szTemp),
Length(szTemp) - lstrlen(szTemp));
StrCat(szTemp, '/HTML_RESOURCE');
MultiByteToWideChar(CP_ACP, 0, szTemp, -1, bstr, length(bstr));
CreateUrlMoniker(nil, bstr, pmk);
if Assigned(pmk) then begin
Wnd:=Doc.Get_parentWindow;
VarArgs:=VarArrayOf([Wnd, Doc, 'VARIANT']);
varReturn:=Unassigned;
hr:=pfnShowHTMLDialog(0, pmk, varArgs, nil, varReturn);
//Wnd._Release;
//pmk._Release;
if SUCCEEDED(hr)
then ShowMessage(varReturn);
end;
end;
FreeLibrary(hinstMSHTML);
end;
// Doc._Release;
end;
end;
[...]
еще пример:
--------------------------------------------------------------------------------
uses ActiveX;
const
CGID_FuckIE4: TGUID = '{ed016940-bd5b-11cf-ba4e-00c04fd70816}'; // UNDOCUMENTED
CGID_MSHTML: TGUID = '{DE4BA900-59CA-11CF-9592-444553540000}'; // DOCUMENTED IE5+
IDM_FIND = 67;
procedure TfWebReport.acReportFindExecute(Sender: TObject);
var
A, B: OleVariant;
Target: IOleCommandTarget;
OleCmd: TOLECMD;
begin
// wbMain - это TWebBrowser
Target := wbMain.Document as IOLECommandTarget;
with OleCmd do begin
cmdId := IDM_FIND;
cmdf := 0;
end;
Target.QueryStatus(@CGID_MSHTML, 1, @OleCmd, NIL);
if (OleCmd.cmdf and OLECMDF_SUPPORTED) <> 0 then
// We have IE5+ use documented manner
Target.Exec(@CGID_MSHTML, IDM_FIND, OLECMDEXECOPT_DODEFAULT, A, B)
else
// We have not IE5+ :-(, use undocumented feature
Target.Exec(@CGID_FuckIE4, 1, OLECMDEXECOPT_DODEFAULT, A, B);
end;
:D Эй я тут Kuliba Faq зырел может тебе падет?
Как у TWebBrowser (IE4 ActiveX) показать диалог Find?
Nomadic советует:
Диалог Find у IE4 сделан через JScript. Этот скрипт лежит в ресурсах mshtml.dll и зовется find.dlg. Вызывается через showHTMLDialog. Вся тонкость в передаче параметров (я немного упростил оригинальный find.dlg и передаю их через SafeArray а не через IDispatch). Вот основная часть кода:
--------------------------------------------------------------------------------
[...]
...
{$R HTMLdlg.res}
...
procedure TForm1.ToolButton1Click(Sender: TObject);
var Disp: IDispatch;
Doc: IHTMLDocument2;
Wnd: IHTMLWindow2;
hr: HResult;
hinstMSHTML: Longint;
pfnShowHTMLDialog: SHOWHTMLDIALOGFN;
szTemp: array [0..MAX_PATH-1] of Char;
bstr: array [0..MAX_PATH-1] of WideChar;
pmk: IMoniker;
varArgs, varReturn: OleVariant;
begin
Disp:=IE4.Document;
hr:=Disp.QueryInterface(IID_IHTMLDocument2, Doc);
Disp._Release;
if (hr=S_OK) then begin
hinstMSHTML:=LoadLibrary('MSHTML.DLL');
if (hinstMSHTML>0) then begin
pfnShowHTMLDialog:=GetProcAddress(hinstMSHTML, 'ShowHTMLDialog');
if Assigned(pfnShowHTMLDialog) then begin
StrCopy(szTemp, 'res://');
GetModuleFileName(hInstance, szTemp + lstrlen(szTemp),
Length(szTemp) - lstrlen(szTemp));
StrCat(szTemp, '/HTML_RESOURCE');
MultiByteToWideChar(CP_ACP, 0, szTemp, -1, bstr, length(bstr));
CreateUrlMoniker(nil, bstr, pmk);
if Assigned(pmk) then begin
Wnd:=Doc.Get_parentWindow;
VarArgs:=VarArrayOf([Wnd, Doc, 'VARIANT']);
varReturn:=Unassigned;
hr:=pfnShowHTMLDialog(0, pmk, varArgs, nil, varReturn);
//Wnd._Release;
//pmk._Release;
if SUCCEEDED(hr)
then ShowMessage(varReturn);
end;
end;
FreeLibrary(hinstMSHTML);
end;
// Doc._Release;
end;
end;
[...]
еще пример:
--------------------------------------------------------------------------------
uses ActiveX;
const
CGID_FuckIE4: TGUID = '{ed016940-bd5b-11cf-ba4e-00c04fd70816}'; // UNDOCUMENTED
CGID_MSHTML: TGUID = '{DE4BA900-59CA-11CF-9592-444553540000}'; // DOCUMENTED IE5+
IDM_FIND = 67;
procedure TfWebReport.acReportFindExecute(Sender: TObject);
var
A, B: OleVariant;
Target: IOleCommandTarget;
OleCmd: TOLECMD;
begin
// wbMain - это TWebBrowser
Target := wbMain.Document as IOLECommandTarget;
with OleCmd do begin
cmdId := IDM_FIND;
cmdf := 0;
end;
Target.QueryStatus(@CGID_MSHTML, 1, @OleCmd, NIL);
if (OleCmd.cmdf and OLECMDF_SUPPORTED) <> 0 then
// We have IE5+ use documented manner
Target.Exec(@CGID_MSHTML, IDM_FIND, OLECMDEXECOPT_DODEFAULT, A, B)
else
// We have not IE5+ :-(, use undocumented feature
Target.Exec(@CGID_FuckIE4, 1, OLECMDEXECOPT_DODEFAULT, A, B);
end;
Мне нужно сделать симуляцию Ctrl+F програмно...Я нарыл такой код но он не работает...В чем проблема????
int lParam = (0 | 'f'<<16);
CppWebBrowser1->SetFocus();
SendNotifyMessage(Memo1->Handle, WM_KEYDOWN, 'f', lParam);
Мне нужно сделать симуляцию Ctrl+F програмно...Я нарыл такой код но он не работает...В чем проблема????
int lParam = (0 | 'f'<<16);
CppWebBrowser1->SetFocus();
SendNotifyMessage(Memo1->Handle, WM_KEYDOWN, 'f', lParam);
а ты уверен что в CPPWEBBROWSER вшит этот диалог? может его надо самому делать:)
вкладка Dialogs - компонент FindDialog :)
а ты уверен что в CPPWEBBROWSER вшит этот диалог? может его надо самому делать:)
вкладка Dialogs - компонент FindDialog :)
Да уверен, только как сделать симуляцию Ctrl+F Я не знаю....есть ещё один код:
keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP,0);
но он вызывает только симуляцию одной клавиши...а сочетание двух не выходит ....Так как быть..Неужели никто не сталкивался с такой проблемой?????