我尝试为 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);
这令人惊讶地让我的窗口重新获得焦点。但当再次尝试从全屏模式切换回时,它突然消失了。
我不明白为什么有那么多不同的功能,但对我来说似乎都在做大致相同的事情。但这并不重要,因为它们都不起作用。
使我的控件正确运行的/一个正确方法是什么?
最佳答案
Windows 可能会有点困惑,因为您正在用一个子窗口填充屏幕,但您希望它表现得像一个顶级(重叠)窗口。宿主应用程序可能没有被激活,因为您隐藏了它的窗口。
您最好为全屏模式创建一个新的顶级全屏窗口。如果它归(最终)托管您的控件的顶级窗口所有,那么您的新窗口将始终位于它之上,因此您无需隐藏现有窗口。激活应该可以正常工作。简而言之,您希望您的窗口表现得像一个弹出式模式对话框。
Adobe 的 Flash Player 似乎做类似的事情。全屏播放在 ShockwaveFlashFullScreen
类的窗口中进行。
关于c++ - ActiveX 控件的全屏模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12583319/