Form怎样能接收到DLL中创建的控件的消息?(200分)

  • 主题发起人 主题发起人 mybps
  • 开始时间 开始时间
M

mybps

Unregistered / Unconfirmed
GUEST, unregistred user!
主程序Form上的有一个TPanel,我现在DLL中创建一个TEdit,调入DLL时让TEdit显示在主程序Form上的TPanel上,同时在主程序Form有KeyPress中要能限制TEdit的输入。
但现在的现象是Form的KeyPress无法拦截到TEdit的消息,用Form的WndProc也不行。
各位富翁,哪位能帮帮小弟。
 
看不明白,楼主是要在TEdit的事件里限制输入还是在Form的事件里限制输入啊?
 
干嘛不用Edit的KeyPress,还有Form的KeyPreview是否为True
 
像楼上说的,你把form的KeyPreview设置为True,应该可以得到键盘输入。但是,你需要知道当前的输入焦点是否是在edit.
 
我的目的是为了一个主程序可以挂接多个具有相同接口的dll,类似于插件。不同的dll内动态生成不同数量、不同功能的TEdit。
在主程序中的KeyPress事件中屏蔽几个指定的键,其余键交给dll处理(dll中可以再对剩下的键进行过滤)。
我将主程序的Form的KeyPreview属性设为True,但是它接收不到dll中TEdit的按钮消息。
 
dll中:
procedure Init(hParent : THandle);
stdcall;
export;
// hParent为主程序Form中的TPanal的句柄。
var
AEdit : TEdit;
begin
AEdit := TEdit.Create(Application);
AEdit.ParentWindow := hParent;
end;

主程序Form中: KeyPreview = True;
Create时调用dll的Init(Panel1.Handle);
procedure TForm1.KeyPress(Sender : TObject;
var Key : Char);
begin
//当焦点在dll中的Edit控件并输入时,这里接收不到消息。
end;
 
用RegistryWindowsMessage注册一个自定义消息
 
to Rainstorey,能否说的详细一点。谢谢
 
procedure Init(hParent : THandle;ff:tform);
stdcall;
export;
// hParent为主程序Form中的TPanal的句柄。
var
AEdit : TEdit;
begin
AEdit := TEdit.Create(Application);
AEdit.ParentWindow := hParent;
AEdit.OnKeyPress:=ff.OnKeyPress;
end;
 
十分感谢 Rainstorey,给分。
另外,再请教一下,如果不传递TForm参数行不行?怎么做? 因为dll不一定全部采用Delphi写。
 
在AEdit中的OnPress事件中SendMessage(hParent,WM_KEYDOWN,ord(Key),0);
在Host中截获WM_KEYDOWN事件就可。
 
后退
顶部