首先用自己的窗口过程替换掉某个窗口句柄(传入的参数)原来的窗口过程,这样就可以截获该窗口的一些消息现在的问题是,当其他窗口向这个窗口发送鼠标消息时(使用WINAPI发送),在自定义的窗口过程中也可以看到,但是由于MFC窗口类是在消息映射函数中处理鼠标事件的,它不需要传递到窗口过程处理。所以这样一来,其他窗口发送的鼠标消息就无法触发该窗口类中定义的消息映射处理函数了,有办法解决么?前提是,我只知道一个窗口句柄,这个窗口句柄到底对应什么窗口类是不知道的,简单点说就是只允许通过一个窗口句柄,能否完成这种处理?伪码如下:// 用户调用
UserCall(HWND hwnd)
{
// 替换窗口过程
ReplaceWndProc(hwnd, MyWndProc);
...
}// 自定义的窗口过程
MyWndProc(MSG msg....)
{
// 调用原来的窗口过程
CallOrgWndProc(msg...);switch (msg)
{
case WM_LBUTTONDOWN:
break;
...
}
}// 另一个窗口发送鼠标消息到这个窗口
SendMessage(hwnd, msg...)在MyWndProc中是可以看到该消息的,但是这个消息是不会触发应用上MESSAGE_MAP的Cxxxx::OnLButtonDown()处理了,换句话说,APP的鼠标消息在MyWndProc中是看不到的,说明这种消息在之前就被处理了现在的问题不是要截获消息,而是怎样把我在DLL发出的消息触发MESSAGE_MAP中定义的消息映射处理,前提就是我只能通过HWND实现,因为在DLL里面我根本不知道外部它对应的窗口类是什么 APP上的鼠标操作在MyWndProc里面是没有的,就是说我用鼠标点窗口,这个消息不会反映到MyWndProc里面,如果我SendMessage发送鼠标消息到这个窗口,能在MyWndProc中看到

解决方案 »

  1.   

    你替换了窗口过程,那么这个窗口的所有消息都不会到原来的窗口过程了。
    如果你要把某些消息交给原来的窗口过程,可以这样:
    WNDPROC lpfnOldProc = SetWindowLong(),  // 这个函数返回原有的窗口过程。在你的窗口过程中:
    case WM_LBUTTONDOWN:
    CallWindowProc(lpfnOldProc, ...)这样Cxxxx::OnLButtonDown()就可以处理了。
      

  2.   

    如果我没理解错你的问题的话,把SendMessage改成PostMessage就可以了。
      

  3.   


    我在MyWndProc里面首先就是CallOldWndProc的....
      

  4.   

    SendMessage是直接调用窗口过程函数,不经过消息泵;PostMessage是经过消息泵处理的。
      

  5.   

    MFC的消息映射函数是被窗口过程调用的,怎么说不经过窗口过程呢?原始的消息映射函数会在CallOrgWndProc时调用到。如果你发现没有调用到,你得检查消息映射函数是不是处理这个窗口消息的,不要拿其它窗口的函数处理本窗口。
      

  6.   


    确实如此,搞了半天是窗口过程弄错了,这些消息是在它的父窗口处理的
    害大家折腾这么久,抱歉!我对不起大家,对不起组织,对不起CCAV....