关于窗口消息(50分)

  • 主题发起人 主题发起人 yeah
  • 开始时间 开始时间
Y

yeah

Unregistered / Unconfirmed
GUEST, unregistred user!
我要制作一个控件,该控件被放置到窗口上,并接管该窗口的所有消息,<br>我用过TWndMethod,好象可以接收一部份,但却不触发WM_NCHITTEST消息!<br>我还试过用接管MDI窗口的ClientWindow的方法如:MakeObjectInstance、Setwindowlong<br>还是不行,哪位指点指点?
 
需要替换原来窗口的WndProc<br>var<br>&nbsp; OldWndProcPtr, NewWndProcPtr: LongInt;<br>begin<br>&nbsp; NewWndProcPtr := LongInt(@MyWndProc);<br>&nbsp; OldWndProcPtr := GetWindowLong(Handle,GWL_WndProc);<br>&nbsp; SetWindowLong(Form.Handle,GWL_WndProc,NewWndProcPtr);<br>end;
 
to huizhang大虾:<br>&nbsp; &nbsp;您的例子编译通不过咧。MyWndProc应该是一个TWndMethod吧<br>是不是Procedure MyWndProc(Var Message:TMEssage)<br>执行NewWndProcPtr := LongInt(@MyWndProc)这一句时显示“要求变量”的错误,我<br>直接这样用也不行SetWindowLong(Handle,GWL_WNDPROC,@MyWndProc)也不行,<br>可能还是要使用MDI中处理ClientWindow的方法,<br>OldWndProcPtr,NewWndProcPtr:TFarproc;<br>begin<br>&nbsp; NewWndProcPtr:=MakeObjectInstance(MyWndProc);<br>&nbsp; OldWndProcPtr:=Pointer(GetWindowlong(Handle,GWL_WNDPROC));<br>&nbsp; SetWindowLong(Handle,GWL_WNDPROC,LongInt(NewWndProcPtr));<br>end;<br>但这样也不行,不知以上语句哪里有错误?(该过程中的Handle是控件取得的实际运行中的窗口的)<br>
 
會長老師好 &nbsp;^0^
 
定义MyWndProc为<br>Procedure MyWndProc(Var Message:TMEssage) &lt;strong&gt;of object&lt;/strong&gt;;<br>然后用&lt;strong&gt;MakeObjectInstance(MyWndProc)&lt;/strong&gt;的返回值作为SetWindowLong的参数. (&lt;font color = red&gt;注意: 释放时别忘记FreeObjectInstance&lt;/font&gt;)<br>或者:<br>定义为如下这种全局函数:<br>function MyWndProc(Handle: THandle; Msg: Cardinal; WParam, LParam: Integer): Integer;<br>这时可以直接将@MyWndProc作为SetWindowLong的参数传递了.
 
Another_eYes大虾的方法也不行哦,最好请给出实现的过程,谢谢。
 
Another_eYes,请给出你的实现过程!
 
截获窗口消息<br>定义一个过程<br>procedure HandleMessage(var Msg: TMsg; var Handled: Boolean);<br>procedure TKeySystem.HandleMessage(var Msg: TMsg; var Handled: Boolean);<br>begin<br>&nbsp; if Msg.Message = 消息 then<br>&nbsp; begin....end;<br><br>在formoncreate事件中加入Application.OnMessage := HandleMessage;<br><br>
 
sunstone大哥:<br>&nbsp; &nbsp;可能您没看清楚题目吧,我说的是制作一个控件,然后让这个控件接管所有该FORM的消息<br>,比如我做的控件名叫TMsgSpy,按您的说法,可以定义一个Public方法,然后在该FORM的<br>ONCREATE事件中指定Application.OnMessage:=MsgSpy.ProcMsg,这样我想可能行得通。<br>我的控件要做的是,在每个窗口上放一个我的控件,就可以接管该窗口的所有消息,而不<br>要用户添加代码!(因为我的控件有特殊用途,要改变所有放置该控件的窗口的外观)
 
要实现过程?<br>很容易.<br>controls.pas 第4842行起.
 
to Another_eYes:<br>&nbsp; &nbsp;您大虾说的是D5还是D4,我在D4中找不到,麻烦您具体说说,怎样在控件中<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;^^^^^^ <br>接管一个窗体的所有消息?(该控件被放置在该窗体上)
 
&nbsp;Another_eYes 大虾的意思是用新的窗口过程 (Window procedure) 替换 Form 原来的<br>窗口过程,这个操作称为“子类化”(Subclassing),查一查 API Help 的 <br>&lt;Subclassing a Window&gt; 条目吧,<br>&nbsp; 为什么总要别人给出完全现成的代码呢?
 
Sorry, some words was missing.<br>请查一查 API Help 的 Subclassing a window 条目
 
To BaKuBaKu:<br>&nbsp; &nbsp; 我知道API中的子类化技术,而且MDI父窗口中设置ClientWindow的背景图片就使用了<br>此技术,有许多现成的代码。<br>&nbsp; &nbsp; 正是因为我知道要使用这类API,而且我也用了,但不能成功我才来问,如果每个大虾<br>都像您大虾一样,回答问题时总叫别人去查API帮助,那人人都是大虾了*_^(如有冒犯,<br>请原谅)<br><br>
 
附加功能 &nbsp; 将问题提前 &nbsp; &nbsp;
 
还是没人回答吗?
 
To yeah:<br>&nbsp; &nbsp;不是没有人回答,是已经回答了。<br>&nbsp; &nbsp;你的控件应该继承 TComponent 类,放到窗体上之后,它的 Owner 默认就是 Form 。<br>&nbsp; TMyComponent = class (Component)<br>&nbsp; private<br>&nbsp; &nbsp; ...<br>&nbsp; &nbsp; OldWndProc: Pointer;<br>&nbsp; &nbsp; procedure WndProc(var Msg: TMessage);<br>&nbsp; &nbsp; ...<br>&nbsp; public<br>&nbsp; &nbsp; constructor Create(AOwner: TComponent);<br>&nbsp; end;<br>constructor TMyComponent.Create(AOwner: TComponent);<br>begin<br>&nbsp; Inherited;<br>&nbsp; OldWndProc=GetWindowLong(TForm(AOwner.Handle), GWL_WNDPROC);<br>&nbsp; SetWindowLong(TForm(AOwner.Handle), GWL_WNDPROC, Longint(MakeObjectInstance(WndProc)));<br>end;<br><br>procedure TMyComponent.WndProc(var Msg: TMessage);<br>begin<br>&nbsp; with Msg do<br>&nbsp; &nbsp; if Msg = (Messages you need) then (Do you operations)<br>&nbsp; &nbsp; else<br>&nbsp; &nbsp; &nbsp; Result := CallWindowProc(OldWndProc, TForm(AOwner.Handle), Msg, wParam, lParam);<br>end;<br>
 
yeah:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。<br><br>
 

Similar threads

后退
顶部