刚刚开始学win32编程,由于某些原因,决定先做一个自己播放器再说。本来就做了个很丑的界面,可是后来越做越来劲,界面重绘,按钮重绘,子窗口什么乱七八糟的都用上了,学到了很多东西,所以决定尽可能把它做好做完善,以练促学。
不废话了,还在完善中。
说主题,今天遇到了一个问题,就是想播放完一首歌,给我的播放按钮发个消息,让它变个样。本来想是用个SetTimer,但是这样好像很没有美感,就想让mcisendstring自己告诉我。查了一番msdn,结论如下
mciSendString("play music notify",NULL,0,hWnd);
这样即可,第4个参数是mcisendstring放完歌后发消息的目标的句柄。
然后在目标控件的处理函数里处理MM_MCINOTIFY消息
可是。。。
我怎么都收不到这个消息,甚至用了点极端的傻办法,MessageBox所有传进来的消息。。。没有该消息
然后各种查阅资料。百度,MSDN,,要么别人根本没这个问题,很顺利,要么是在求解决办法。
好啦,说下解决办法,其实很简单,我终于把注意力集中到msdn里一个函数上,
mciGetErrorString
用了一下。它告诉我,大意就是,不能对
自动打开
的文件做啥啥啥。
好吧,原因就在这里。正确用法如下(纯win32SDK)
在需要放歌的地方 void play(...) { ..... mciSendString("open music",NULL,0,NULL); //music表示文件路径 mciSendString("play music notify",NULL,0,hWnd); //hWnd就是你想mcisendstring发消息去的地方的句柄。 } 在接收消息的函数里 ...... XXX_Proc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { ... switch(message) { case MM_MCINOTIFY: { if(MCI_NOTIFY_SUCCESSFUL==wParam) //MCI_NOTIFY_SUCCESSFUL表示歌成功播放完,还有些别的消息,msdn里有说明 { .....(在这儿做你想在歌曲播放完毕这个事发生后做的事吧) } } break; ...... } ..... }