如何捕获WM_SETFOCUS消息?(100分)

  • 主题发起人 主题发起人 philipliu
  • 开始时间 开始时间
P

philipliu

Unregistered / Unconfirmed
GUEST, unregistred user!
如何捕获WM_SETFOCUS消息?
 
<br>&nbsp; TForm1 = class(TForm)<br>&nbsp; ...<br>&nbsp; protected<br>&nbsp; &nbsp; procedure WMSetFocus(var Msg: TWMSetFocus); message WM_SETFOCUS;<br>&nbsp; ...<br>&nbsp; end;<br><br>implememtation<br>...<br>procedure TForm1.WMSetFocus(var Msg: TWMSetFocus);<br>begin<br>&nbsp; ...<br>&nbsp; //你的处理<br>&nbsp; inherited;<br>end;<br>
 
To bbkxjy:<br>&nbsp; 此法不行,不知你试过了吗??
 
问题简单,就没人想拿分吗??
 
对于 form 的 WM_SETFOCUS 消息照以上是可以截获的,我试过了,还弄得死循环了,因为<br>我在消息中 showmessage,按确定后 form 又获得了焦点,又再次触发消息处理过程...<br>不知你试过了没有?还是你要捕获的是其它控件的消息而不是 Form 的?
 
TO:bbkxjy<br>如果是form上的编辑框呢?都要定义每个控件的消息截获过程吗?
 
每个可视控件都有WM_SETFOCUS消息,要用谁的就写谁的.
 
有一个办法,不用为 form 上的每一个控件写 WM_SETFOCUS 方法,但可以截获每个控件<br>的该消息:<br>&nbsp; TForm1 = class(TForm)<br>&nbsp; &nbsp; ...<br>&nbsp; public<br>&nbsp; &nbsp; function SetFocusedControl(Control: TWinControl): Boolean; override;<br>&nbsp; &nbsp; ...<br>&nbsp; end;<br><br>implememtation<br>...<br>function TForm1.SetFocusedControl(Control: TWinControl): Boolean;<br>begin<br>&nbsp; <br>&nbsp; //你的处理,Control 是将获得焦点的控件,若设 Result := False,<br>&nbsp; //则控件不能获得焦点<br>&nbsp; Result := inherited SetFocusedControl(Control);//缺省处理<br>end;<br>
 
TO bbkxjy:<br>那失去focus的控件呢?怎么判断??
 
似乎在 form 一级要截获子 WinControl 的 WM_KillFocus 消息没有很好的办法,要不照<br>jennykiller 的办法,要派生新类,或者你为 Application 的 OnMessage 事件写处理过程<br>来截获该消息吧。
 
TO bbkxjy:<br>Application 的 OnMessage 根本截不到时子 WinControl 的 WM_KillFocus 消息,还有好<br>办法吗?
 
我也觉得奇怪的,在 Application 的 ProcessMessage 中设断点,总是不能截获 KillFocus<br>消息,但在为 Form 写的截获该消息的处理过程中设断点,中断时看 CallStack 又明明显示<br>ProcessMessage 已被调用,在调用栈的栈底,怎么不会先在 ProcessMessage 中的断点处中<br>断呢?<br>如果你只想在消息发生时得到通知,可以试试用 Screen 的 OnActiveControlChange 事件。<br>如果要改变对消息的处理方式,可能要利用 SetWindowLong 替换所有子 WinControl 的窗口<br>过程或改写 StdWndProc,唉,越弄越复杂了...
 
每个控件都是一个window,他有自己的WinProc,重载这个东西行不行?
 
&nbsp; &nbsp;Puzzle说对了,可以重载这个过程,就能够截获这个消息了!junnykiller与bbkxjy都是正确的<br><br>
 
放分啦!
 
后退
顶部