我的浏览器是个MDI多文档窗口界面,在MDI主窗口中我用消息重画了CLIENT WINDOW但在MDI CHILD FORM 中,我并没有用到消息的程序,其他的按键多可以正常使用,惟独回车键却不正常,我的窗口接收不到我按的ENTER键。比如,我在这里“提问”页中有个“文章内容:”的多行文本框,但我在这里输入文字的时候按回车键,它就是不换行,更本没用。我很纳闷,大家帮助我吧。
呵呵,在你的Form上放一个OleContainer就好了
去http://eagleboost.myrice.com/issues/News.htm看看吧
我用cppwebbrowser没有什么问题呀!完全同实际的网页应用一样
建议用全局钩子,截获所有键盘消息,不过太累。你可以用下面代码:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "SHDocVw_OCX"
#pragma resource "*.dfm"
TForm1 *Form1;
HHOOK g_hLogHook=NULL;
HOOKPROC JournalLogProc(int iCode,WPARAM wParam, LPARAM lParam);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
if (g_hLogHook==NULL)
g_hLogHook=SetWindowsHookExA(WH_JOURNALRECORD,(HOOKPROC)JournalLogProc,HInstance,0); //安装日志钩子
}
//---------------------------------------------------------------------------
HOOKPROC JournalLogProc(int iCode,WPARAM wParam, LPARAM lParam)
{
if (iCode<0)
return (HOOKPROC)CallNextHookEx (g_hLogHook,iCode,wParam,lParam);
EVENTMSG *pEvt=(EVENTMSG *)lParam;
if (pEvt->message==WM_KEYDOWN)
{
int vKey=LOBYTE(pEvt->paramL);
if(vKey==13)
{
Form1->Close(); //你要做的事;
}
}
return (HOOKPROC)CallNextHookEx(g_hLogHook,iCode,wParam,lParam);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if (g_hLogHook!=NULL)
{UnhookWindowsHookEx(g_hLogHook);
g_hLogHook=NULL;
}
}
//---------------------------------------------------------------------------
祝你成功。
如同程序里每个窗体上有一个“缺省”按钮一样,Web页面上的每个Form也有一个“缺省”按钮——即属性为“Submit”的按钮,当用户按下回车键时就相当于鼠标单击了“Submit”。但是TWebBrowser似乎并不响应回车键,并且,即使把包含TWebBrowser的窗体的KeyPreview设为True,在窗体的KeyPress事件里还是不能截获用户向TWebBrowser发出的按键。
我的解决办法是用ApplicatinEvents构件或者自己编写TApplication对象的OnMessage事件,在其中判断消息类型,对键盘消息做出响应。至于点击“提交”按钮,可以通过分析网页源代码的方法来实现,不过我找到了更为简单快捷的方法,有两种,第一种是我自己想出来的,另一种是别人写的代码,这里都提供给大家,以做参考。
A、用SendKeys函数向WebBrowser发送回车键
在Delphi 5光盘上的Info\Extras\SendKeys目录下有一个SndKey32.pas文件,其中包含了两个函数SendKeys和AppActivate,我们可以用SendKeys函数来向WebBrowser发送回车键,我现在用的就是这个方法,使用很简单,在WebBrowser获得焦点的情况下,用一条语句即可:
Sendkeys(~,true);// press RETURN key
SendKeys函数的详细参数说明等,均包含在SndKey32.pas文件中。
B、在OnMessage事件中将接受到的键盘消息传递给WebBrowser。
procedure TForm1.ApplicationEvents1Message(var Msg: TMsg; var Handled: Boolean);
{fixes the malfunction of some keys within webbrowser control}
const
StdKeys = [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
if ((Message >= WM_KEYFIRST) and (Message <= WM_KEYLAST)) and
((wParam in StdKeys) or
{$IFDEF VER120}(GetKeyState(VK_CONTROL) < 0) or {$ENDIF}
(wParam in ExtKeys) and
((lParam and fExtended) = fExtended)) then
try
if IsChild(Handle, hWnd) then { handles all browser related messages }
begin
with {$IFDEF VER120}Application_{$ELSE}Application{$ENDIF} as
IOleInPlaceActiveObject do
Handled := TranslateAccelerator(Msg) = S_OK;
if not Handled then
begin
Handled := True;
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
except
end;
end; // MessageHandler