想写一个控件,要求能截获窗体和窗体中的VCL的消息,不知怎么办,哪位大侠能给点思路呀?! ( 积分: 100 )

  • 主题发起人 主题发起人 DragonInCity
  • 开始时间 开始时间
D

DragonInCity

Unregistered / Unconfirmed
GUEST, unregistred user!
想写一个控件,要求能截获窗体和窗体中的VCL的消息,不知怎么办,哪位大侠能给点思路呀?!(不能用Application.OnMessage事件和ApplicationEvents控件)
 
想写一个控件,要求能截获窗体和窗体中的VCL的消息,不知怎么办,哪位大侠能给点思路呀?!(不能用Application.OnMessage事件和ApplicationEvents控件)
 
哪位大侠能给一点思路呀!!!!谢谢
 
真郁闷呀,自己顶一下吧
 
自己顶一下吧
 
//覆盖虚消息处理函数WndProc
unit Unit1;

interface

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

type
TForm1 = class(TForm)
private
{ Private declarations }
protected
//覆盖虚消息处理函数WndProc
procedure WndProc(var Message: TMessage); override;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.WndProc(var Message: TMessage);
begin
inherited WndProc(Message);
//截获鼠标左键按下的消息
if Message.Msg=WM_LBUTTONDOWN then
Showmessage('截获成功');
end;
end.
 
To:老香子
覆盖窗体虚消息处理函数WndProc只能截获窗体中的消息,但是VCL中的消息并不能够被截获
 
Application包含一个大小为零的隐藏窗体,这个窗体才是Delphi程序的主窗体,你可以“子类化”这个窗体的窗口过程,或者使用TApplication的HookMainWindow方法,更详细的描述可以参考《Delphi 5开发人员指南》第十三章
 
谢谢thx1180,晚上回去看看
 
我记得我“子类化”过Application的隐藏窗体,没成功,不过还可以试试使用TApplication的HookMainWindow方法
 
用TApplication的HookMainWindow方法好象也不行呀,以下是我的源代码

unit Unit1;

interface

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

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
function AppWindowHook(var Message:TMessage):Boolean;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

function TForm1.AppWindowHook(var Message: TMessage): Boolean;
begin
if Message.Msg=WM_INPUTLANGCHANGEREQUEST then //输入法切换时
showmessage('sfsdf');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.HookMainWindow(AppWindowHook);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
Application.UnHookMainWindow(AppWindowHook);
end;

end.
 
The WM_INPUTLANGCHANGEREQUEST message is posted to the application's top-level window when the user chooses an input language
这就是说WM_INPUTLANGCHANGEREQUEST消息是直接发送到一个程序最顶层的窗口的,所以应该去hook这个最顶层的窗口才行[:)]
 
我知道,可如果窗体上有其它的控件,如TEDIT,TMEMO等那该怎么办,总不能让我每个控件都去hook吧
 
如果这个窗体上有其它能够得到焦点的控件,你再去hook这个最顶层的窗口就没用了,根本截获不到消息
 
那你说怎么办啦?我也没招了,要不你去写个hook消息的DLL吧,自己查查SetWindowsHookEx
 
我也想这样呀,可你们谁见过在一个VCL中使用hook的,那样的话,DLL怎么处理呀
 
后退
顶部