关于win32消息处理机制,如何返回默认的处理机制?请大神来看看,帮我分析一下问题吧
项目用win32+duilib编写,使用ffmpeg进行播放视频。
代码如下,问题写在代码中
class CDuiPlayFrameWnd : public WindowImplBase { //。。。 virtual void Notify(TNotifyUI& msg) { if (msg.sType == _T("click")) { //。。。。 else if (msg.pSender->GetName() == _T("BtnFS")) { if (vs) { wp.length = sizeof(WINDOWPLACEMENT); GetWindowPlacement(hWnd, &wp); SetWindowLong(hWnd, GWL_STYLE, WS_VISIBLE | WS_POPUP); m_hWnd = SetParent(hWnd, NULL); MoveWindow(hWnd, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), true); ShowWindow(false); IsFS = true; WNDPROC BToldProc; //全屏的时候调用了hWndProc作为处理消息Loop BToldProc = (WNDPROC)SetWindowLong(hWnd, GWL_WNDPROC, (LONG)hWndProc); ShowCursor(FALSE); } } } } virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_KEYDOWN: switch (wParam) { case VK_SPACE: if (IsPlaying) { SDL_PauseAudio(1); vs->pause = true; IsPlaying = false; } else { SDL_PauseAudio(0); vs->pause = false; IsPlaying = true; } break; } } return WindowImplBase::HandleMessage(uMsg,wParam,lParam); } //。。。。 }; LRESULT CALLBACK hWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { switch (Msg) { case WM_KEYDOWN: switch (wParam) { case VK_ESCAPE: wp.length = sizeof(WINDOWPLACEMENT); SetWindowPlacement(hWnd, &wp); SetWindowLong(hWnd, GWL_STYLE, WS_VISIBLE | WS_CHILD); SetParent(hWnd, PlayWindowFrame.GetHWND()); PlayWindowFrame.ShowWindow(true); IsFS = false; ShowCursor(TRUE); //这里是用户按下Esc时,全屏退出。如何恢复原始窗口的消息Loop机制, //就是上面的virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) //现在的情况是退出全屏后,再按空格是恢复全屏,再一次按空格是全屏的暂停, //正常的情况是退出全屏后,再按下空格,应该是原始窗口的暂停播放才对啊。 break; case VK_SPACE: if (IsPlaying) { SDL_PauseAudio(1); vs->pause = true; IsPlaying = false; } else { SDL_PauseAudio(0); vs->pause = false; IsPlaying = true; } break; } } return DefWindowProc(hWnd, Msg, wParam, lParam); }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
能说明一下PlayWindowFrame.GetHWND()与一开始的hWnd的关系吗?
PlayWindowFrame.GetHWND()是播放视频的真正窗体句柄。嵌在Duilib自绘窗体里。Duilib自绘窗体的句柄是hWnd。就这种父子嵌tao关系
引用来自“parva”的评论
你既然都获取了BToldProc,把它保存起来,在hWndProd的VK_ESCAPE里用SetWindowLong将其恢复不就行了。
引用来自“simawei”的评论
LRESULT
LRESULT