0

I tried to implement a switch-to-fullscreen mode for an ActiveX control. This currently works by removing and hiding the parent window and changing my control's placement and position.

However, I have a problem with switching between applications while the control is in fullscreen mode. If I switch to another application and then click on my window area (not in the taskbar), it seems to not be activated. You can see in the taskbar, that another application still has the highlight and on the main screen, my window is partly hidden behind the taskbar unless it has the focus.

I process the WM_LBUTTONDOWN window message to detect if my window is clicked. And I already tried to call the following WINAPI functions:

::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

I also tried to use ::SetWindowLongW(m_hWnd, GWL_STYLE, WS_VISIBLE); which surprisingly gave my window the focus back. But it then suddenly disappeared when trying to switch back from fullscreen mode again.

I have no idea why there are so many different functions that for me seem all to do roughly the same. But it doesn't matter as none of them worked anyway.

What is the/one correct way to behave my control correctly?

4

1 に答える 1

4

画面を子ウィンドウでいっぱいにしているため、ウィンドウが少し混乱している可能性がありますが、最上位の (オーバーラップした) ウィンドウのように動作させたいと考えています。ウィンドウを非表示にしたため、ホスト アプリケーションがアクティブ化されていない可能性があります。

フルスクリーン モード用にトップレベルのフルスクリーン ウィンドウを新しく作成した方がよい場合があります。これが (最終的に) コントロールをホストするトップレベル ウィンドウによって所有されている場合、新しいウィンドウは常にその上に表示されるため、既存のウィンドウを非表示にする必要はありません。アクティベーションはうまくいくはずです。つまり、ウィンドウをポップアップ モーダル ダイアログのように動作させる必要があります。

Adobe の Flash Player も同様のことをしているようです。全画面再生は、クラスのウィンドウで行われますShockwaveFlashFullScreen

于 2012-09-25T14:33:37.157 に答える