だから...誰かが興味を持っている場合は、ここに私の「研究」があります。
解決策 1) 失敗しました。この動作に関するいくつかの議論を見つけました。これはバグだと言う人もいれば、機能だと言う人もいますが、いずれもマネージ コードでは解決できないと想定しています。また、シェリダンの答えから試してみましたが、うまくいきませんでした。
解決策 2) 失敗しました。私は P/Invoke の経験がありますが、何か問題が発生した場合は通常失敗します。この特定のケースでは、私は使用しようとしました
this.Handle = new WindowInteropHelper(this).Handle;
SetWindowPos(this.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
ウェブ全体で示唆されているように。このコードはウィンドウを表示しません。だから私はそれを表示しようとしました
ShowWindow(this.Handle, 4); // I also tried SHOW_NORMAL and few other flags
しかし、ウィンドウはまだ見えませんでした
this.Visibility = /*visible*/
またはを実行すると表示されるようにthis.Show()
なり、ウィンドウが一番上にあることが実際にわかりますが、問題は解決せず、フルスクリーンがエスケープします。内部でどのように動作するか、および P/Invoke で WPF ウィンドウを表示する方法を誰かが知っている場合.Show()
は、お知らせください。
解決策 3) 成功します。ここで少しグーグルで動作するコードを見つけ、少し短くしました:
internal class FullscreenCheck
{
[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
private static extern IntPtr GetDesktopWindow();
[DllImport("user32.dll")]
private static extern IntPtr GetShellWindow();
[DllImport("user32.dll", SetLastError = true)]
private static extern int GetWindowRect(IntPtr hwnd, out RECT rc);
// I hope this handles never changes
private static IntPtr hndlDesktop = GetDesktopWindow();
private static IntPtr hndlShell = GetShellWindow();
public static bool IsFullscreen()
{
var hndlForeground = GetForegroundWindow();
if (hndlForeground == null || hndlForeground == IntPtr.Zero || hndlForeground == hndlDesktop || hndlForeground == hndlShell)
{
return false;
}
RECT appBounds;
GetWindowRect(hndlForeground, out appBounds);
var screenBounds = System.Windows.Forms.Screen.FromHandle(hndlForeground).Bounds;
return ((appBounds.Bottom - appBounds.Top) == screenBounds.Height && (appBounds.Right - appBounds.Left) == screenBounds.Width);
}
したがって、最後のステップは呼び出され.Show()
ない場合ですIsFullscreen() == true