Twebbrowser控件做简单的浏览器时遇到问题,高手进来指点呀!!(36分)

  • 主题发起人 主题发起人 aifafa
  • 开始时间 开始时间
A

aifafa

Unregistered / Unconfirmed
GUEST, unregistred user!
第一:我做的浏览器没有回车功能???就是回车不行?
第二:在弹出式网页时它又自动调用IE浏览器?怎么样能控制调用我自己的浏览器???


就这么多分了!!!
 
procedure TForm1.WebBrowserNewWindow2(Sender: TObject; var ppDisp: IDispatch;
var Cancel: WordBool);
begin
ppdisp := webBrowser.Application;
end;
 
那回车功能呢????

还有IE上的(文件),(编辑),(查看),(收藏),(工具)等里面的功能用Twebbrowser怎么样实现?????



高手帮忙,如果分不够另外开贴!!!
 
还有TwebBrowser失去的回车键怎么样实现??

我看了别人的例子:   在Delphi
   5光盘上的Info/Extras/SendKeys目录下有一个SndKey32.pas文件,其中包含了两个函数SendKeys和AppActivate,我们可以用SendKeys函数来向WebBrowser发送回车键,我现在用的就是这个方法,使用很简单,在WebBrowser获得焦点的情况下(不要求WebBrowser所包含的文档获得焦点),用一条语句即可:
      Sendkeys('~',true);// press RETURN key
可是我用的是delphi 7应该在哪里面????
 
各位大哥:我现在在网上查了有关资料:
就是让TwebBrowser找回回车键!
我先获得焦点:
procedure TForm1.SetFocusToDoc;
begin
if WebBrowser1.Document <> nil then
      IHTMLWindow2(IHTMLDocument2(WebBrowser1.Document).ParentWindow).focus ;
Sendkeys('VK_ENTER',true);
end;
然后调用sendkey函数:
procedure Tform1.SendKeys(sSend:string);
var
i:integer;
focushld,windowhld:hwnd;
threadld:dword;
ch: byte;
begin
windowhld:=GetForegroundWindow;
//获得前台应用程序的活动窗口的句柄
threadld:=GetWindowThreadProcessId(Windowhld,nil);
//获取与指定窗口关联在一起的一个进程和线程标识符
AttachThreadInput(GetCurrentThreadId,threadld,true);
//通常,系统内的每个线程都有自己的输入队列。 //
//AttachThreadInput允许线程和进程共享输入队列。 //
//连接了线程后,输入焦点、窗口激活、鼠标捕获、键盘状态 //
//以及输入队列状态都会进入共享状态 //
Focushld:=getfocus;
//获得拥有输入焦点的窗口的句柄
AttachThreadInput(GetCurrentThreadId,threadld,false);
if focushld = 0 then Exit;
//如果没有输入焦点则退出发送过程
i := 1;
while i <= Length(sSend) do
//该过程发送指定字符串(中英文皆可以)
begin
ch := byte(sSend[ i ]);
if Windows.IsDBCSLeadByte(ch) then
begin
Inc(i);
SendMessage(focushld, WM_IME_CHAR, MakeWord(byte(sSend[ i ]), ch), 0);
end
else
SendMessage(focushld, WM_IME_CHAR, word(ch), 0);
Inc(i);
end;
end;
可是老是抱错:
[Error] Unit1.pas(179): Too many actual parameters

我该怎么修改??????
 
各位大哥我现在又遇到一个问题:
我是用动态创建Tabsheet来动态创建webbrowser来增加新浏览的窗体,可是我现在却无法在新创建的webbrowser使用事件了????
比如:WebBrowser1DownloadComplete等,? 我该怎么把新创建的窗体也能响应事件!


帮帮我呀 各位!!!
 
兄弟,不要做梦了,activeForm,不当回车鬼扯,删除键<== 也鬼扯!
而且网页是框架,连鼠标,光标上下左 也鬼扯!
 
to 13708782004,
你的意思是说:
第一:用webbrowser也就无法使用回车键吗???
第二:我动态创建Tabsheet来动态创建webbrowser来增加新浏览的窗体,就一定无法在新创建的webbrowser使用事件了????

我有点郁闷了!!!!
 
我认为可以。
 
第一个问题,换TEmbeddedWB
http://www.euromind.com/iedelphi/index.htm
 
function TFrm_FCMainForm.NewWebWind(const URL: string = ''): IDispatch;
var
NewWb: TWebBrowser;
NewTb: TTabSheet;
begin
NewTb := TTabSheet.Create(pgc_WEB);
NewTb.PageControl := pgc_WEB;
NewTb.ShowHint := True;
NewTb.OnShow := ts6Show;
if URL <> '' then
NewTb.Caption := URL
else NewTb.Caption := cbb_httpUrl.Text;
NewTb.Show;

NewWb := TWebBrowser.Create(NewTb);
NewWb.Align := alClient;
//事件
NewWb.OnNewWindow2 := wb1NewWindow2;
NewWb.OnDocumentComplete := wb1DocumentComplete;
NewWb.OnTitleChange := wb1TitleChange;
NewWb.OnStatusTextChange := wb1StatusTextChange;
NewWb.OnBeforeNavigate2 := wb1BeforeNavigate2;
NewWb.OnProgressChange := wb1ProgressChange;

TWinControl(NewWb).Parent := NewTb;
if URL <> '' then
NewWb.Navigate(URL);
Result := NewWb.Application;
end;

procedure TFrm_FCMainForm.wb1NewWindow2(Sender: TObject;
var ppDisp: IDispatch; var Cancel: WordBool);
begin
ppDisp := NewWebWind();
end;

回车键免强还可以
procedure TFrm_FCMainForm.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);

const
AStdKeys = [VK_TAB, VK_RETURN]; { standard keys }
ExtKeys = [VK_DELETE, VK_BACK, VK_LEFT, VK_RIGHT]; { extended keys }
fExtended = $01000000; { extended key flag }
begin
Handled := False;
with Msg do // ((Message >= WM_KEYDOWN)and (Message <= WM_KEYLAST))
if (Message = WM_KEYDOWN)and
((wParam in AStdKeys) or
{$IFDEF VER120}(GetKeyState(VK_CONTROL) < 0) or {$ENDIF}
(wParam in ExtKeys) and ((lParam and fExtended) = fExtended)) then
try
if IsChild(pgc_WEB.ActivePage.Handle, hWnd) then { handles all browser related messages }
begin
//这里是指TWebBrowse的句柄
AppActivate(PChar(pgc_WEB.ActivePage.Controls[0].Name));
case Message of
VK_RETURN: begin
Sendkeys('~',true);
Handled := False;
end;
end;
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
except

end;
end;

这个单元在大富翁上就有SendKey32.pas
http://www.richsearch.com/search/search.aspx?S1=SendKey32.pas&Submit1=+%E6%A3%80%E7%B4%A2+
 
to jfyes,
我刚才看了你的回复,第二个解决了
谢谢你
现在还是回车键的问题,我在
http://www.richsearch.com/search/search.aspx?S1=SendKey32.pas&Submit1=+%E6%A3%80%E7%B4%A2+
里打不开呀? 能不能重新给个连接呀? 多谢!
 
to jfyes
还有一个小问题, 就是在增加新的webbrowser时比如我用:
NewWb.OnDocumentComplete := wb1DownloadBegin;//这个事件时,
我在wb1DownloadBegin(Sender: TObject)里是这样写的:
begin
statusbar1.Panels[0].Text:='正在打开网页'+webbrowser1.LocationURL ;
end;
这样我在新增加newWb后它的事件是可以调用了 ,可是这statusbar1里仍然显示是老的webbrowser1的URL,还是不能显示新的newWb的URL? 该怎么修改? 用函数调用吗?
 
if Sender is TWebBrowse then //强制转换
statusbar1.Panels[0].Text:='正在打开网页'+ TWebBrowse(Sender).LocationURL ;

SendKey32.pas http://www.delphibbs.com/delphibbs/dispq.asp?lid=2186614
 
//你在程序中加TApplicationEvents组件用它的 ApplicationEvents.OnMessage //事件
ApplicationEvents1: TApplicationEvents;
procedure FormCreate(Sender: TObject);
 
真的十分感谢jfyes
我把你告诉我的方法: statusbar1.Panels[0].Text:='正在打开网页'+ TWebBrowse(Sender).LocationURL ;试了,完全可以的 呵呵,
另外我还用你告诉我的方法用了:
TWebBrowser(sender).Document.QueryInterface(ihtmldocument2,idoc1);
form1.Caption:=idoc1.title; (这个完全可以实现)
TTabsheet(sender).Caption:=idoc1.title; (不过这个好象不行,他显示的是tabsheet1)? 道理应该是一样的呀?
另外我把你说的: 调用了SNDKEY32.PAS(也正确)。
然后添加:ApplicationEvents1: TApplicationEvents;加进去了,
然后在添加: procedure ApplicationEvents1Message(var Msg: tagMSG;var Handled: Boolean);
在后面调用这个事件procedure Tform1.ApplicationEvents1Message(var Msg: tagMSG;var Handled: Boolean);可是编译的时候却报错了:自动去掉了(ApplicationEvents1: TApplicationEvents;)这个,这样的话 回车键还是不行,
谢谢jfyes在帮我解答一次!,我马上放分,
 
这个TApplicationEvents组件要手动添加,在Additional选项页里;
你也可不要,直接指定Application.OnMessage := ApplicationEvents1Message;//你定义的OnMessage过程。
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, AppEvnts;

type
TForm1 = class(TForm)
ApplicationEvents1: TApplicationEvents;
procedure ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
const
AStdKeys = [VK_TAB, VK_RETURN]; { standard keys }
ExtKeys = [VK_DELETE, VK_BACK, VK_LEFT, VK_RIGHT]; { extended keys }
fExtended = $01000000; { extended key flag }
begin
Handled := False;
with Msg do // ((Message >= WM_KEYDOWN)and (Message <= WM_KEYLAST))
if (Message = WM_KEYDOWN)and
((wParam in AStdKeys) or
{$IFDEF VER120}(GetKeyState(VK_CONTROL) < 0) or {$ENDIF}
(wParam in ExtKeys) and ((lParam and fExtended) = fExtended)) then
try
if IsChild(pgc_WEB.ActivePage.Handle, hWnd) then { handles all browser related messages }
begin
AppActivate(PChar(pgc_WEB.ActivePage.Controls[0].Name));
case Message of
VK_RETURN: begin
Sendkeys('~',true);
Handled := False;
end;
end;
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
except

end;
end;

end.
 
谢谢 jhyes
回车问题解决了!
现在只剩下一个问题了:就是我上次说的:我用你告诉我的方法:
TWebBrowser(sender).Document.QueryInterface(ihtmldocument2,idoc1);
form1.Caption:=idoc1.title; (这个完全可以实现)
TTabsheet(sender).Caption:=idoc1.title; (不过这个好象不行,他显示的是tabsheet1)? 道理应该是一样的呀?
有点不理解,
 
html的文档标题,应该是这个事件里写吧,
procedure TFrm_FCMainForm.wb1TitleChange(Sender: TObject;
const Text: WideString);
begin
if (TWinControl(Sender).Parent) is TTabSheet then begin
if Length(WideString(Text)) > 9 then
TTabSheet(TWinControl(Sender).Parent).Caption := Copy(WideString(Text), 1, 9) + '... '
else
TTabSheet(TWinControl(Sender).Parent).Caption := Text;
TTabSheet(TWinControl(Sender).Parent).Hint := Text;
TTabSheet(TWinControl(Sender).Parent).ShowHint := False;
end;
end;
 
我试了,感觉好象只对第一个tabsheet起作用 标题更换的时候也触发了这个事件,
可是当增加新的tabsheet好象还是没有作用,新的tabsheet还是没有触发到这个事件,

谢谢jfyes
 

Similar threads

D
回复
0
查看
943
DelphiTeacher的专栏
D
D
回复
0
查看
882
DelphiTeacher的专栏
D
D
回复
0
查看
959
DelphiTeacher的专栏
D
D
回复
0
查看
786
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部