在克隆屏幕后,如何在C#中放置一个全屏窗口?

时间:2014-11-24 09:40:05

标签: c# wpf

我正在使用两个屏幕的C#WPF应用程序。在应用程序中,用户能够根据用户想要的内容克隆或扩展屏幕。这是在Windows 7中完成的,并使用以下代码:

[DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Unicode)]
private static extern long SetDisplayConfig(uint numPathArrayElements, IntPtr pathArray, uint    numModeArrayElements, IntPtr modeArray, uint flags);

UInt32 SDC_TOPOLOGY_INTERNAL = 0x00000001;
UInt32 SDC_TOPOLOGY_CLONE = 0x00000002;
UInt32 SDC_TOPOLOGY_EXTEND = 0x00000004;
UInt32 SDC_TOPOLOGY_EXTERNAL = 0x00000008;
UInt32 SDC_APPLY = 0x00000080;

public void CloneDisplays()
{
    SetDisplayConfig(0, IntPtr.Zero, 0, IntPtr.Zero, (SDC_APPLY | SDC_TOPOLOGY_CLONE));
}
public void ExtendDisplays()
{
    SetDisplayConfig(0, IntPtr.Zero, 0, IntPtr.Zero, (SDC_APPLY | SDC_TOPOLOGY_EXTEND));
}

现在我的问题。使用上面的代码时,我设法克隆/扩展屏幕。但是,完成此操作后,屏幕底部的任务栏位于全屏应用程序的前面,不应该是这种情况。如何将应用程序窗口置于顶部?

其他信息: 当我启动应用程序时,它会在应用程序后面的任务栏全屏启动。这可以通过设置以下内容来完成:

WindowState="Maximized"
WindowStyle="None"

这就是克隆/扩展完成后我想要的。 感谢

修改 我注意到,在克隆/扩展屏幕并睡了5秒之后,一切正常。但是,只要5秒结束并且退出任务栏的功能就会显示在顶部。因此,似乎我无法在克隆/扩展后立即更改某些内容,因为任务栏最终将始终位于顶部。所以我不得不弄清楚如何停止任务栏的行为,而不是改变窗口的属性。

3 个答案:

答案 0 :(得分:0)

尝试按如下方式设置WPF窗口的宽度和高度,您可以在窗口构造函数中设置它。

Width = System.Windows.SystemParameters.PrimaryScreenWidth;
Height = System.Windows.SystemParameters.PrimaryScreenWidth;

隐藏任务栏尝试设置,

Width = System.Windows.SystemParameters.FullPrimaryScreenWidth;
Height = System.Windows.SystemParameters.FullPrimaryScreenHeight;

答案 1 :(得分:0)

我已经在winforms应用程序中进行了全屏模式,但我认为你可以在WPF中或多或少地做同样的事情:

(这必须与WPF中的不同但相似):

form.WindowState = FormWindowState.Normal;
form.FormBorderStyle = FormBorderStyle.None;
form.Bounds = Screen.GetBounds(form);

如果您的应用程序在主屏幕上,则下一步是隐藏任务栏:

if (Screen.PrimaryScreen.Equals(Screen.FromRectangle(Screen.GetBounds(form))))
{
    ShowWindowsToolbar(false);
}

方法ShowWindowsToolbar()实现如下:

[DllImport("user32.dll")]
private static extern int FindWindow(string lpszClassName, string lpszWindowName);
[DllImport("user32.dll")]
private static extern int ShowWindow(int hWnd, int nCmdShow);
private const int SW_HIDE = 0;
private const int SW_SHOW = 1;

public void WindowsToolbar(bool visible)
{
    int hWnd = FindWindow("Shell_TrayWnd", "");
    ShowWindow(hWnd, visible ? SW_SHOW : SW_HIDE);
}

那是什么方式,大多数工具如何支持这种东西。另请注意,按 F11 可以主要进入/离开此模式。如果你也支持这次击键,那就太好了。

答案 2 :(得分:0)

原则上我要做的就是更新调度程序队列并强制它在克隆/扩展完成后立即进行更新。然后我可以更新窗口属性。

public void ExtendDisplays()
{
    SetDisplayConfig(0, IntPtr.Zero, 0, IntPtr.Zero, (SDC_APPLY | SDC_TOPOLOGY_EXTEND));
    this.Dispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate { })); //Force update
    current_window.hide();
    current_window.show();
}