已知一个edit的句柄,如何得到他的onchange事件?(50分)

  • 主题发起人 主题发起人 coolbaby
  • 开始时间 开始时间
C

coolbaby

Unregistered / Unconfirmed
GUEST, unregistred user!
用windows消息么?
 
有些不太明白,edit中不是以有onchang事件了吗?<br>你要实现的是什么功能呢?
 
用windows API可以接管窗口的callback函数,其他的消息自己处理<br>EnumThreadWndProc
 
我没写明白<br>这个edit是其他程序的<br><br>秋风萧萧:能给个例子么?
 
哪位大虾来点实惠的<br>给个例子呗!<br>不全也行,核心代码写出来就行!
 
如果单单知道一个 Edit 的句柄,获得它的 OnChange 事件(Delphi 及 BCB 定义的)是不可能的。<br>你想想,这个 Edit 可以是 VC, Delphi, BCB, VB 等创建的,而 VC, VB 等对它的 Change 事件的<br>处理方法并不完全与 Delphi, BCB 的相同。<br>但是,你可以用 Hook 技术拦截这个 Edit 的消息达到类似的效果。<br>
 
对,是用Hook 技术拦截这个 Edit 的消息达到类似的效果。<br><br>星际浪人: 我对hook还不太熟练,能不能给个例子!谢谢!
 
coolbaby,请问你是怎样获得这个Edit的句柄的?
 
那好办,可以用findwindowex!
 
有句柄,可以用回调函数SetWindowLong GetWindowLong截获CM_TEXTCHANGED消息,<br><br>如果你想获得一个TEdit的实例句柄,那就不太现实了,除非该程序支持插件技术,你设计<br>一个插件,调用 Application.Components[]可以获得对象实例,Delphi Expert都是这么干得。<br>
 
给段代码吧,大虾!
 
Declear part:<br><br>&nbsp; &nbsp; private<br>&nbsp; &nbsp; &nbsp; &nbsp; FClientInstance,<br>&nbsp; &nbsp; &nbsp; &nbsp; FPrevClientProc : TFarProc;<br>&nbsp; &nbsp; &nbsp; &nbsp; procedure ClientWndProc(var UsrMsg: TMessage);<br><br>OnCreate event:<br>&nbsp; &nbsp; FClientInstance := MakeObjectInstance(ClientWndProc);<br>&nbsp; &nbsp; FPrevClientProc := Pointer(GetWindowLong(EditHandle, GWL_WNDPROC));<br>&nbsp; &nbsp; SetWindowLong(EditHandle, GWL_WNDPROC, LongInt(FClientInstance));<br><br>OnDestoy event:<br>&nbsp; &nbsp; FreeObjectInstance(FClientInstance) ;<br>&nbsp; &nbsp; SetWindowLong(EditHandle, GWL_WNDPROC, LongInt(FPrevClientProc));<br><br>procedure Txxxxx.ClientWndProc(var UsrMsg: TMessage);<br>begin<br>&nbsp; with UsrMsg do<br>&nbsp; &nbsp; Result := CallWindowProc(FPrevClientProc, AppBuilder.Handle, Msg, wParam, lParam);<br>&nbsp; &nbsp; case Msg of<br>&nbsp; &nbsp; &nbsp; &nbsp; CM_TEXTCHANGED: // Do you event handle here ;<br>&nbsp; &nbsp; end ;<br>&nbsp; end;<br>end;<br><br><br>&nbsp; &nbsp; &nbsp; &nbsp; <br>
 
我觉得用SetWindowLong(GWL_WndProc,......)可行!<br>但没有试过!
 
我觉得只有钩子才能"钩"到你想要的消息
 
多人接受答案了。
 
后退
顶部