windows 如何使用 SPI_SETWORKAREA 标志调整桌面工作区的大小?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/6267206/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How can I resize the desktop work area using the SPI_SETWORKAREA flag?
提问by Jelle Vergeer
I have been trying for quite a while now to resize the desktop work area (the area where windows get maximized). I have found the required API, but I can't seem to resize the work area. It does just nothing.
我一直在尝试调整桌面工作区(窗口最大化的区域)的大小已经有一段时间了。我找到了所需的 API,但我似乎无法调整工作区的大小。它什么都不做。
I use Windows 7 Ultimate x64 so I also tried compiling it in x64 'mode', and still no luck. Could someone give me a push in the right direction?
我使用 Windows 7 Ultimate x64,所以我也尝试在 x64“模式”下编译它,但仍然没有运气。有人可以给我一个正确的方向推动吗?
Here is what I got so far:
这是我到目前为止所得到的:
[DllImport("user32.dll", EntryPoint = "SystemParametersInfoA")]
private static extern Int32 SystemParametersInfo(Int32 uAction, Int32 uParam, IntPtr lpvParam, Int32 fuWinIni);
private const Int32 SPIF_SENDWININICHANGE = 2;
private const Int32 SPIF_UPDATEINIFILE = 1;
private const Int32 SPIF_change = SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE;
private const Int32 SPI_SETWORKAREA = 47;
private const Int32 SPI_GETWORKAREA = 48;
public struct RECT
{
public Int32 Left;
public Int32 Right;
public Int32 Top;
public Int32 Bottom;
}
private static int SetWorkspace(RECT oRECT)
{
IntPtr ptr = IntPtr.Zero;
ptr = Marshal.AllocHGlobal(Marshal.SizeOf(oRECT));
Marshal.StructureToPtr(oRECT, ptr, true);
return SystemParametersInfo(SPI_SETWORKAREA, Marshal.SizeOf(oRECT), ptr, SPIF_change);
}
回答by Cody Gray
The following code should work just fine:
以下代码应该可以正常工作:
// 1. Change the function to call the Unicode variant, where applicable.
// 2. Ask the marshaller to alert you to any errors that occur.
// 3. Change the parameter types to make marshaling easier.
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool SystemParametersInfo(
int uiAction,
int uiParam,
ref RECT pvParam,
int fWinIni);
private const Int32 SPIF_SENDWININICHANGE = 2;
private const Int32 SPIF_UPDATEINIFILE = 1;
private const Int32 SPIF_change = SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE;
private const Int32 SPI_SETWORKAREA = 47;
private const Int32 SPI_GETWORKAREA = 48;
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public Int32 Left;
public Int32 Top; // top is before right in the native struct
public Int32 Right;
public Int32 Bottom;
}
private static bool SetWorkspace(RECT rect)
{
// Since you've declared the P/Invoke function correctly, you don't need to
// do the marshaling yourself manually. The .NET FW will take care of it.
bool result = SystemParametersInfo(SPI_SETWORKAREA,
IntPtr.Zero,
ref RECT,
SPIF_change);
if (!result)
{
// Find out the error code
MessageBox.Show("The last error was: " +
Marshal.GetLastWin32Error().ToString());
}
return result;
}
But I'm not really sure what you're trying to do. By default, the work area is the portion of the screen not obscured by the system taskbar or by application desktop toolbars. You're not going to be able to make it any larger than the area that's available on your screen (neat trick if you could, though!). Do your windows not already fill the entire screen when you maximize them?
但我不太确定你想要做什么。默认情况下,工作区是屏幕上未被系统任务栏或应用程序桌面工具栏遮挡的部分。你不能让它比屏幕上可用的区域更大(不过,如果可以的话,这是一个巧妙的技巧!)。当您最大化它们时,您的窗口是否还没有填满整个屏幕?
And even on machines with multiple monitors, you can't set the working area to span multiple monitors. The MSDN documentationsays that it's constrained to setting the working area of the monitor that contains the specified rectangle:
即使在具有多个显示器的机器上,您也无法将工作区域设置为跨越多个显示器。在MSDN文档说,这是受限于设置,包含指定的矩形显示器的工作区域:
In a system with multiple display monitors, the function sets the work area of the monitor that contains the specified rectangle.
在具有多个显示监视器的系统中,该函数设置包含指定矩形的监视器的工作区域。