Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Программный Ctrl+F

496
17 июля 2004 года
Jes
81 / / 28.03.2003
Приветствую всех....Народ подскажите как в CppWebBrowser програмно вызвать диалог поиска, тоесть при нажатии кнопки фокусился CppWebBrowser и вылетало окошко поиска (Ctrl+F) для дальнейшего поика на странице........

За ранее благодарствую...
8.2K
18 июля 2004 года
eSDee
3 / / 18.07.2004
Цитата:
Originally posted by Jes
Приветствую всех....Народ подскажите как в 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;

496
18 июля 2004 года
Jes
81 / / 28.03.2003
Цитата:
Originally posted by eSDee


: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);

323
18 июля 2004 года
Sergun
228 / / 20.09.2000
Цитата:
Originally posted by Jes


Мне нужно сделать симуляцию Ctrl+F програмно...Я нарыл такой код но он не работает...В чем проблема????

int lParam = (0 | 'f'<<16);
CppWebBrowser1->SetFocus();
SendNotifyMessage(Memo1->Handle, WM_KEYDOWN, 'f', lParam);



а ты уверен что в CPPWEBBROWSER вшит этот диалог? может его надо самому делать:)
вкладка Dialogs - компонент FindDialog :)

496
19 июля 2004 года
Jes
81 / / 28.03.2003
Цитата:
Originally posted by Sergun


а ты уверен что в CPPWEBBROWSER вшит этот диалог? может его надо самому делать:)
вкладка Dialogs - компонент FindDialog :)




Да уверен, только как сделать симуляцию Ctrl+F Я не знаю....есть ещё один код:

 
Код:
keybd_event(VK_LWIN, 0, 0 ,0);
keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP,0);

но он вызывает только симуляцию одной клавиши...а сочетание двух не выходит ....Так как быть..Неужели никто не сталкивался с такой проблемой?????
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог