一个MP3播放器,现在我要让另一个程序能够控制它(通过发消息)播放器界面上有一个Pause按钮,映射到 OnButtonPause函数.所以,我在接收到上面定义的消息后,直接
调用OnButtonPause. 但是,这么做后界面上的按钮是表现正确(从Pause切换到Play,因为play和pause共用一个按钮),但是歌曲却还在放,歌曲的播放进度条也没有停下来.
 
然后我在调用OnButtonPause后,再调用一个AfxMessgaeBox随便弹了个对话框,这下就能正确运行了....但是,我不可能为了解决这个问题而每次都去弹对话框啊??!!!请教高手,问题出在哪里?  该怎么解决?

解决方案 »

  1.   

    SendMessage() or PostMessage()
      

  2.   

    void CMainDlg::OnButtonPause() 
    { if(!m_Playctrl)return;
    m_Playctrl->OnPause();
    // AfxMessageBox(L"Pause");
    }
    程序是执行到了这里的,把上面的注释去掉就能够表现正确. m_Playctrl的定义:IPlayCtrl *m_Playctrl;IPlayCtrl的声明:
    struct IPlayCtrl
    {
    enum{T_Remove,T_Search,T_AddAll};
    enum{STG_HDD,STG_SDMMC,STG_SCARD,STG_COUNT=STG_SCARD}; virtual BOOL InitMain(IPlayUI*,IMainUI*,HWND) PURE;
    virtual void SetFileList(IFileList* pFileList) PURE;
    virtual void OnTimer() PURE;
    virtual void SetHide(UINT nInterval) PURE;
    virtual void PlayCurFile() PURE;
    virtual void ReadyForPlay() PURE; virtual void OnPause() PURE;
    virtual void OnPrev(int nCount=1) PURE;
    virtual void OnPlay() PURE;
    virtual void OnNext(int nCount=1) PURE;
    virtual void OnStop(BOOL) PURE;
    virtual void OnMinimize() PURE;
    virtual void OnQuit() PURE;

    virtual void OnPosMoving(LONG) PURE;
    virtual void OnVolMoving(LONG) PURE;
    virtual void OnPosMoved(LONG) PURE;
    virtual void OnVolMoved(LONG) PURE;

    virtual void OnRepeating(UINT wParam) PURE;
    virtual void OnRepeated(UINT wParam) PURE;
    virtual BOOL OnKeyDown(UINT wParam) PURE;
    virtual BOOL OnKeyUp(UINT wParam) PURE; virtual LRESULT OnGraphNotify(BOOL bLooping) PURE;
    virtual LRESULT OnAutoStopped() PURE;
    virtual LRESULT OnHotKey(UINT) PURE;
    virtual LRESULT OnActivate(UINT) PURE;
    virtual BOOL IsShow(int nIndex)PURE;
    virtual BOOL IsReady() PURE; virtual void SetTitle(LPCTSTR) PURE;
    virtual void SetLabelText(LPCTSTR,LPCTSTR,LPCTSTR) PURE; virtual void ReleaseStorage(int nStgIndex) PURE;
    virtual void RefreshStorage(int nStgIndex) PURE;
    virtual void SetCurManager(UINT nStgIndex) PURE;
    virtual UINT NextManager() PURE;
    virtual MediaFileManager *GetCurManager() PURE;
    };  
      

  3.   

    另外我模拟按钮点击
    ::SendMessage(GetDlgItem(IDC_BUTTON_PAUSE)->GetSafeHwnd(),BM_CLICK,0,0);
    或者
    ::SendMessage(GetDlgItem(IDC_BUTTON_PAUSE)->GetSafeHwnd(),WM_LBUTTONDOWN,0,0);
    ::SendMessage(GetDlgItem(IDC_BUTTON_PAUSE)->GetSafeHwnd(),WM_LBUTTONUP,0,0);
    都是跟直接调用OnButtonPause表现一样,而歌曲还是没有停下来
      

  4.   

    跟踪你的那个OnButtonPause() ,看消息能够在此被处理
      

  5.   

    在发BM_CLICK前加一句事事
    ::SendMessage(GetDlgItem(IDC_BUTTON_PAUSE)->GetSafeHwnd(),BST_FOCUS,0,0);
      

  6.   

    ::SendMessage(GetDlgItem(IDC_BUTTON_PAUSE)->GetSafeHwnd(),BM_CLICK,0,0);
    Sleep(100) ;???
      

  7.   

    消息应该没有问题,都收到消息了
    是不是m_Playctrl->OnPause();里的问题呢?
      

  8.   

    那大家知道AfxMessageBox的弹出机制是什么呢?也就是说弹出MessageBox的时候会有什么消息被接收到呢?
      

  9.   

    我想MessageBox()在这里也就是将你的主线程阻塞了一会儿。建议用Sleep()试试。
      

  10.   

    把AfxMessageBox的地方换成Sleep试试
      

  11.   

    我用
    ::SendMessage(GetDlgItem(IDC_BUTTON_PAUSE)->GetSafeHwnd(),BM_CLICK,0,0);
    Sleep(100) ;播放的声音暂停了一下然后又继续播放.但是如果只用AfxMessage,而不用::SendMessage(GetDlgItem(IDC_BUTTON_PAUSE)->GetSafeHwnd(),BM_CLICK,0,0);的话,对话框弹出来的时候,声音是不会有停顿的,看来Sleep(100)不能模仿AfxMessageBox
      

  12.   

    还有,我调用
    ::SendMessage(GetDlgItem(IDC_BUTTON_PAUSE)->GetSafeHwnd(),BM_CLICK,0,0);
    或者OnBtnPause都是在PreTranslateMessage里面做的