用PreTransxxxxmessage,这是处理消息前的一个函数,重载它就可以。

解决方案 »

  1.   

    在对话框类里吗?App中没有吗?
      

  2.   

    有啊。任何WINDOWS类都有。最低级的就是CWnd类了。再下去就用Prexxmessage,dispatchxxxmessage等API了。
      

  3.   

    首先要确定要处理的消息是否只能通过框架的过程处理?实际上通过重载PreTransMessage()函数,基本上基于windows 的消息都能处理。
      

  4.   

    我在App中重载了:BOOL CDetectorApp::PreTranslateMessage(MSG* pMsg)好像并没有起到作用,连极小化等消息都没拦截到
      

  5.   

    PreTranslateMessage是个虚函数,重载它可以得到一切消息,你是怎么拦截的,把源码贴出来看看
      

  6.   

    BOOL CDetectorApp::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class
    switch (pMsg->message){
    case MYWM_NOTIFYICON:
        if(pMsg->lParam==WM_LBUTTONDBLCLK)
    {
         AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW); 
    }
    break; case WM_SYSCOMMAND:
           if(pMsg->wParam==SC_MINIMIZE)
       {
       AfxMessageBox("hi");
    AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE); 
            //return 0;
       }
    break; 
    }
    return CWinApp::PreTranslateMessage(pMsg);
    }SC_MINIMIZE是系统消息,和映射没有关系吧?为什么拦截不到呢?
      

  7.   

    CDetectorApp是个什么类啊,你要重载mainframe的pretranslatemessage才行
      

  8.   

    问题就在这里啊,CDetectorApp是我的App啊,我没有mainframe来供我重载pretranslatemessage(),因为我的工程是基于对话框的,没有mainframe的类
      

  9.   

    classwizard 里有
    自己去看吧
      

  10.   

    不太明白,classwizard里有?
    返回TRUE也没有什么用的,发现很快就进行正常处理(最小化)说明没有正常返回TRUE;
      

  11.   

    在classwizard里给你的类添加虚函数PreTranslateMessage,然后edit code,自己写就行了
      

  12.   

    是啊,我上边贴的代码就是这样写出来的,只不过是在App类中重载的pretranslatemessage(),这样难道不成吗?
      

  13.   

    找到一些原因:
    PreTranslateMessage确实起到了作用,但当我最小化的时候,他却不认为收到的是SC_MINIMIZE消息!
      

  14.   

    在dialog类中重载 WindowProc OK
    WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    { if (message==WM_SYSCOMMAND)
    {
    if (wParam==SC_MINIMIZE)
    {
    AfxMessageBox("hello");
    return 1;
    }
    }
    return CDialog::WindowProc(message, wParam, lParam);