我正在使用两个屏幕的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秒结束并且退出任务栏的功能就会显示在顶部。因此,似乎我无法在克隆/扩展后立即更改某些内容,因为任务栏最终将始终位于顶部。所以我不得不弄清楚如何停止任务栏的行为,而不是改变窗口的属性。
答案 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();
}