ActiveX控件的全屏模式

时间:2012-09-25 12:50:04

标签: c++ windows winapi activex fullscreen

我尝试为ActiveX控件实现切换到全屏模式。目前,这可以通过删除和隐藏父窗口并更改控件的位置和位置来实现。

但是,当控件处于全屏模式时,我在应用程序之间切换时遇到问题。如果我切换到另一个应用程序,然后单击我的窗口区域(不在任务栏中),它似乎没有被激活。您可以在任务栏中看到另一个应用程序仍然具有突出显示,并且在主屏幕上,我的窗口部分隐藏在任务栏后面,除非它具有焦点。

我处理WM_LBUTTONDOWN窗口消息以检测我的窗口是否被点击。我已经尝试调用以下WINAPI函数:

::ShowWindow(m_hWnd, SW_RESTORE);
::SwitchToThisWindow(m_hWnd, FALSE);
::SetForegroundWindow(m_hWnd);
::SetActiveWindow(m_hWnd);
::SetFocus(m_hWnd);
::BringWindowToTop(m_hWnd);
::SetWindowPos(m_hWnd, HWND_TOP, m_monitorInfo.rcMonitor.left, m_monitorInfo.rcMonitor.top, m_monitorInfo.rcMonitor.right, m_monitorInfo.rcMonitor.bottom, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW); // SWP_NOACTIVATE, SWP_NOOWNERZORDER

我也尝试使用::SetWindowLongW(m_hWnd, GWL_STYLE, WS_VISIBLE);令人惊讶地让我的窗口回到焦点。但是当它再次尝试从全屏模式切换回来时突然消失了。

我不知道为什么有这么多不同的功能对我来说似乎都大致相同。但无论如何都无关紧要。

正确执行控制的正确方法是什么?

1 个答案:

答案 0 :(得分:4)

Windows可能会让您感到有些困惑,因为您正在使用子窗口填充屏幕,但您希望它的行为类似于顶级(重叠)窗口。主机应用程序可能没有被激活,因为你已经隐藏了它的窗口。

您可能最好为全屏模式创建新的顶级全屏窗口。如果它由(最终)托管您的控件的顶级窗口拥有,那么您的新窗口将始终位于其上方,因此您无需隐藏现有窗口。激活应该工作。简而言之,您希望窗口的行为类似于弹出模式对话框。

Adob​​e的Flash播放器似乎做了类似的事情。全屏播放位于课程ShockwaveFlashFullScreen的窗口中。