关于win32消息处理机制,如何返回默认的处理机制?请大神来看看,帮我分析一下问题吧

发布于 2021-11-28 08:40:43 字数 2275 浏览 652 评论 5

项目用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

陌若浮生 2021-12-03 05:35:57

能说明一下PlayWindowFrame.GetHWND()与一开始的hWnd的关系吗?

醉酒的小男人 2021-12-03 05:02:51

PlayWindowFrame.GetHWND()是播放视频的真正窗体句柄。嵌在Duilib自绘窗体里。Duilib自绘窗体的句柄是hWnd。就这种父子嵌tao关系

疑心病 2021-12-02 04:26:21

引用来自“parva”的评论

你既然都获取了BToldProc,把它保存起来,在hWndProd的VK_ESCAPE里用SetWindowLong将其恢复不就行了。

时光清浅 2021-12-01 20:50:45

引用来自“simawei”的评论

LRESULT
  

千纸鹤带着心事 2021-11-30 23:16:06

LRESULT
  

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文