关于窗体和非可视组件之间的消息传递!!(50分)

  • 主题发起人 主题发起人 zhbruce
  • 开始时间 开始时间
Z

zhbruce

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一个非可视控件,控件就作用是响应windows 窗体的消息。如把控件放在窗体Form1<br>中当按窗体的最小化键,在控件里就响应窗体发过来的消息执行一个动作。<br>&nbsp; &nbsp;现在不知道如何把捕捉的window窗体消息传递给控件,让控件根据消息过行处理。<br>&nbsp; &nbsp;请各位大侠指点迷津!<br>&nbsp; &nbsp;感谢各位帮助。<br>&nbsp; &nbsp;<br>
 
又是消息?<br><br>不知道你会不会用钩子,对于你的这种要求,,你可以使用WH_CALLWNDPROC类型的钩子,这种<br>类型的钩子会在窗口函数收到一个消息时,调用这个钩子,这样你就可以根据收到的消息来<br>做不同的工作了,,,,你在WINSDK或DELPHI中的帮助里找一下HOOK FUNCTION,你可以找到<br>你想要的,,这种钩子不难,,<br><br>你也可以在论坛上搜一搜,,很多了,,
 
这是我的例子.<br><br>var<br>&nbsp; &nbsp; WHook &nbsp; &nbsp; &nbsp;: HHook;<br>&nbsp; &nbsp; ScrCapInst : TDXCapture;<br><br>{------------------------------------------------------------------------------}<br>function CallWndProcHook(nCode: Integer; wParam: longint; var Msg: TCWPStruct) : longint;<br>&nbsp; &nbsp; stdcall;<br>begin<br>&nbsp; &nbsp; case Msg.message of<br>&nbsp; &nbsp; &nbsp; &nbsp; WM_DISPLAYCHANGE: ScrCapInst.ScreenChang;<br>&nbsp; &nbsp; end;<br>&nbsp; &nbsp; Result := CallNextHookEx(WHook, nCode, wParam, longint(@Msg))<br>end;<br><br>{------------------------------------------------------------------------------}<br>procedure AddHook(SCI: TDXCapture);<br>begin<br>&nbsp; &nbsp; if ScrCapInst = nil then<br>&nbsp; &nbsp; &nbsp; &nbsp; ScrCapInst := SCI;<br>&nbsp; &nbsp; WHook := SetWindowsHookEx(WH_CALLWNDPROC, @CallWndProcHook, 0, GetCurrentThreadId)<br>end;<br><br>{------------------------------------------------------------------------------}<br>procedure RemoveHook;<br>begin<br>&nbsp; &nbsp; UnHookWindowsHookEx(WHook);<br>&nbsp; &nbsp; ScrCapInst := nil<br>end;<br>
 
to :xwings<br><br>你也太热情了吧?呵呵,,,,,不错,,,,,
 
[8D][8D][8D]<br>不好意思. 这个要不能放在组件里.也就是一个全局的hook.
 
to xwings and HeyTommy<br>能放在组件里的hook.是什么hook?<br>在组件里的hook能捕捉到窗体的消息吗
 
“在组件里的hook能捕捉到窗体的消息吗”有意思的问题!等待,学习[:)]
 
HOOK就是WINDOWS提供的一种截取系统提供的某种服务,换成自己所需的服务的技术,你可以<br>参考相应的资料。<br>非可视控件响应消息没有这么复杂吧。<br>找找相应的资料,我们一起找找啊
 
为什么总把事情搞复杂呢?这种问题不用hook一样解决嘛!<br><br>首先为form定义一个自己的消息处理函数:myWndProc,接到消息后就调用控件的某一个<br>方法来通知他,比如:CallComponentNewMessage(msg:TMessage); 控件在这个方法里面<br>判断是不是自己需要处理的消息。<br><br>或者更简单些,不用修改form任何代码,只要在控件里面首先取得所在form的消息处理<br>函数并保存下来,然后把所在form的WndProc指向自己的一个函数,就是说首先截获form<br>的消息,如果是需要处理的消息就处理,否则调用form原来的消息处理函数,把消息还给窗口。
 
后退
顶部