本文整理自网络,侵删。
使用ApplicationEvents来拦截窗体消息项目需要一些全屏展示的web页面,结果碰到一个问题,当窗体上的webbrowse控件打开了网页之后,窗体就不响应键盘消息了~~~~郁闷了会儿,过后才研究出来用ApplicationEvents这个控件就可以实现~~~要么的话,就只有HOOK窗口消息了~~以下是OnMessage事件,用来阻止WebBrowser的右键菜单:procedure TfrmSearch.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);begin //如果是Webbrowser,则不许使用右键菜单 if IsChild(WebBrowser1.Handle,Msg.Hwnd) and ((Msg.Message = WM_RBUTTONDOWN) or (Msg.Message=WM_RBUTTONUP)) then begin Handled:=True; end;end; 当焦点在WebBrowser控件中时,窗体是不会响应键盘消息的,可以用以下方法来处理,比如中按ESC运行命令~//用ApplicationEvents控件,拦截ESC键按下的消息!procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);begin if (Msg.message = WM_KEYDOWN) AND (Msg.wParam=VK_ESCAPE) then begin if IsChild(Webbrowser1.Handle, Msg.hwnd) then showmessage('在这里做你想做的'); end else;end;再来举个简单的例子,dbgrid的滚动条相关的。dbgrid中假如记录很多,使用鼠标滚动条滚动的时候,只会在dbgrid当前页面数据内滚动,而滚动条是不会动的,这样操作很不方便,需要再拖动滚动条去滚动数据。加了TApplicationEvents就可以去判断事件触发对应的方法。代码:新建应用程序工程,直接在界面上放个dbgrid,高度不要太高,写form的oncreate事件和TApplicationEvents的onmessage事件。不放和放TApplicationEvents,你可以看下效果。unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs,DBClient,DB, Grids, DBGrids, AppEvnts;typeTForm1 = class(TForm)DBGrid1: TDBGrid;ApplicationEvents1: TApplicationEvents;procedure FormCreate(Sender: TObject);procedure ApplicationEvents1Message(var Msg: tagMSG;var Handled: Boolean);private{ Private declarations }cdstemp:TClientDataSet;ds:TDataSource;public{ Public declarations }end;varForm1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);vari:Integer;begin//创建对象cdstemp:=TClientDataSet.Create(Application);ds:=TDataSource.Create(Application);//创建dataset列with cdstemp dobeginActive:=False;FieldDefs.Clear;FieldDefs.Add('id',ftString,32);CreateDataSet;Active:=True;end;//生成测试数据for i:=0 to 20 dobegincdstemp.Append;cdstemp.FieldByName('id').AsInteger:=i;cdstemp.Post;end;//绑定ds.DataSet:=cdstemp;DBGrid1.DataSource:=ds;end;procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;var Handled: Boolean);begin//先判断焦点在不在DBGrid上if DBGrid1.Focused thenbegin//判断是不是鼠标滚轮事件if Msg.message = WM_MOUSEWHEEL thenbeginif Msg.wParam > 0 then//滚动条往上滚SendMessage(DBGrid1.Handle, WM_KEYDOWN, VK_UP, 0)else//滚动条往下滚SendMessage(DBGrid1.Handle, WM_KEYDOWN, VK_DOWN, 0);Handled := True;end;end;end;end.
相关阅读 >>
Delphi tms web core webmemo 横竖滚动条
Delphi combobox的属性和事件、及几个鼠标事件的触发
Delphi android windows ios通用获取程序版本
Delphi防止因系统崩溃而丢失任务栏的图标(重建托盘图标)
Delphi xe(indy10)tidbytes转ansistring的实现
更多相关阅读请进入《Delphi》频道 >>