当光标停在edit控件上时,敲击键盘时,线程不响应键盘消息,如何实现让edit控件响应数字按键消息,让线程响应其它字母按键产生的消息?谢谢!

解决方案 »

  1.   

    有窗口,用鼠标点击那个窗口也无法把焦点改变。
    该窗口是把static text的句柄传给仿真线程开启的窗口
      

  2.   

    PreTranslateMessage可以截获主窗口消息吧
      

  3.   

    消息都是线程处理的,edit控件响应消息的窗口函数也是线程执行的。
    如果焦点在某个控件上,那么所有键盘消息最终都会到那个控件的窗口函数中处理,你可以继承控件并重载WindowProc消息处理函数。
      

  4.   


    你现在连Windows消息及至都没搞多清楚,用钩子跨度太大了。
      

  5.   

    基于dialog的MFC仿真程序
    以下是用静态变量和静态函数实现的全局变量PublicMember.cpp
    /*
    //
     ***********************************************************
     公共成员变量
     包含主要的公共成员变量.
    ************************************************************/ //场景窗口句柄
    HWND  PublicMember::CTS_RunningWindow =NULL;    //控制VP线程运行的变量
    bool  PublicMember::CTS_continueRunVP=NULL; //VP线程变量
        CWinThread *  PublicMember::CTS_vegaThread=NULL; //VP对象容器
        InstancesList* PublicMember::CTS_s_pInstancesToUnref=NULL ; //VP对象文件路径
        vpSearchPath * PublicMember::CTS_pSearchPath_mySearchPath=NULL; //VP场景对象
        vpScene* PublicMember::CTS_pScene_myScene=NULL; //VP观察者对象
    vpObserver * PublicMember::m_pObserver=NULL; //vpCoordSys* PublicMember::m_local=NULL; //vpCoordConverter* PublicMember::m_localCoordConv=NULL;

    //VP对象外挂物
    vpObject* PublicMember::CTS_pObject_other=NULL;     CString PublicMember::CTS_RunPath=NULL; //VPTestDialogDlg* PublicMember::vpdialog = NULL; //vsDOF * PublicMember::m_turret=NULL;
    //vsDOF * PublicMember::m_barrel=NULL; //vpFxParticleSystem *PublicMember::m_mainGunFlash=NULL; vpMotionTetherSpin* PublicMember::m_pTetherSpin = NULL; bool PublicMember::m_bPositionShip = true;

    double PublicMember::m_dX0 = 0.0;
    double PublicMember::m_dY0 = 250.0;
    float PublicMember::m_fRadius =190.0f;
    int PublicMember::m_fWind_Speed = 0.0f;
    float PublicMember::m_fWind_Direction = 0.0f;
    float PublicMember::m_fSigWaveH = 0.0f;
    float PublicMember::m_fModal_Period = 0.0f;
    float PublicMember::m_fSSWF = 0.0f;
    vpObject* PublicMember::m_pShipObj= NULL; vpMarineOcean *PublicMember::m_pOcean = NULL;
     
    vpMarineShip* PublicMember::m_pShip = NULL; vuField< vpMarineShipMotionStrategy * > PublicMember::m_pShipMotionStrategy = NULL; vpMarineWaveGeneratorFFT* PublicMember::m_pWaveGenerator = NULL; vpTransform* PublicMember::m_pXFormShipFront = NULL; vpTransform* PublicMember::m_pXFormShipRear = NULL; vpPositionable::StateVector PublicMember::sv;
     /* ***********************************************************
     公共成员函数
     包含主要的公共函数.
    ************************************************************/PublicMember::PublicMember(void)
    : m_dTimeToStart(0.0)
    , m_bCruising(false)
    , m_dInitialAngularVelocity(0.0)
    {
    }PublicMember::~PublicMember(void)
    {
    }void  PublicMember::CTS_Keyboard(vpWindow *window,vpWindow::Key key, int modifier,void *)
    {
    switch(key)
    {
    /*
       位置控制*/
    case vrWindow::KEY_m:
                m_bPositionShip = ! m_bPositionShip;
                break;
    //控制观察位置
    case vrWindow::KEY_w:
                m_pObserver->setStrategy( vpMotion::find( "myMotionUFO" ) );
                m_pObserver->setLookAt( NULL );
                m_pObserver->setLookFrom( NULL );
                break;
    }
    UINT PublicMember::CTS_RunBasicThread(LPVOID) 
    {
    //初始化
    vp::initialize(__argc,__argv); vpMarineOcean::setUpdateSemantic( 
                                   vpMarineOcean::UPDATE_SEMANTICS_ASYNCHRONOUS ); //定义场景
    PublicMember::CTS_Define(); 
    //绘制场景
    vpKernel::instance()->configure();
    PublicMember::m_pObserver = *vpObserver::begin();
    m_pOcean = vpMarineOcean::find( "OceanObserverCentered" );    if ( m_pOcean )
        {
            m_pWaveGenerator = static_cast< vpMarineWaveGeneratorFFT * >(m_pOcean->getWaveGenerator());        //---------------------------------------------------------------------
            // Initialize the ship definition and motion parameters.
            //---------------------------------------------------------------------
            m_pShipObj  = vpObject::find( "ShipObj" );
            initializeShip();        //---------------------------------------------------------------------
            // Create and initialize the tether spin position strategy, which 
            // circles around a particular object (in this case, the ship).
            //---------------------------------------------------------------------
            m_pTetherSpin = new vpMotionTetherSpin;        m_pTetherSpin->ref();
            m_pTetherSpin->setRadius( 80.0 );
            m_pTetherSpin->setAngularRate( 0.14 );
            m_pTetherSpin->setTetherReference( m_pShipObj );
            m_pTetherSpin->setElevation( m_pOcean->getTideHeight() + 2.3 );
            m_pTetherSpin->setInputEnable( true );        m_pObserver->setStrategy( m_pTetherSpin );
        }
        else
        {
            printf( "Could not find ocean named \"OceanObserverCentered\"-- exiting!\n" );
            
        }//

    //设置窗体
    vpWindow * vpWin= * vpWindow::begin();
    vpWin->setParent(PublicMember::CTS_RunningWindow);
    vpWin->setBorderEnable(false);
    vpWin->setFullScreenEnable(true); //设置键盘
    vpWin->setInputEnable(true);
    vpWin->setKeyboardFunc((vrWindow::KeyboardFunc)PublicMember::CTS_Keyboard,NULL); vpWin->open();
    ::SetFocus(vpWin->getWindow()); //

     
       //帧循环
    while(vpKernel::instance()->beginFrame()!=0)
    {
    if ( m_bPositionShip )
                positionShip();
    m_pWaveGenerator->setSurfaceWindSpeed(m_fWind_Speed);
                    //m_fWind_Speed跟edit控件关联
                    vpKernel::instance()->endFrame();  
    if(!PublicMember::CTS_continueRunVP)
    {   vpKernel::instance()->endFrame(); /* chan->removeSubscriber(vsChannel::EVENT_POST_DRAW,wang,false);    wang=NULL;*/
         vpKernel::instance()->unconfigure();
     
         vp::shutdown();
     
      return 0;
      }


    }
    return 0;

    }//VPTestDialogDlg.cpp
    //启动工作者线程 button按钮
    //m_fWind_Speed跟edit控件关联
    void CVPTestDialogDlg::OnBnClickedbtrun()
    {
    // TODO: 在此添加控件通知处理程序代码
    CWnd *pWnd=GetDlgItem(IDC_grScene);
    PublicMember::CTS_RunningWindow=pWnd->GetSafeHwnd();
    PublicMember::CTS_continueRunVP=true;
    if(PublicMember::CTS_continueRunVP = true)
    GetDlgItem(IDC_btRun)->EnableWindow(FALSE);
    PublicMember::CTS_vegaThread=AfxBeginThread(PublicMember::CTS_RunBasicThread ,this );
    }
    //edit控件
    void CVPTestDialogDlg::OnEnChangeEdittest()
    {
    UpdateData(true);
    PublicMember::m_fWind_Speed = m_edittest;
    }谢谢!