如何使用SPI_SETWORKAREA标志调整桌面工作区的大小?

我一直在尝试调整桌面工作区域(窗口最大化的区域)。 我find了所需的API,但似乎无法调整工作区域的大小。 它什么也没有做。

我使用Windows 7旗舰版64位,所以我也尝试编译它在x64'模式',仍然没有运气。 有人能给我一个正确的方向?

这是我到目前为止:

[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); } 

下面的代码应该工作得很好:

 // 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; } 

但我不确定你想要做什么。 默认情况下,工作区是系统任务栏或应用程序桌面工具栏不遮挡的屏幕部分。 你不能把它做得比屏幕上可用的区域大(如果可以,整洁的伎俩!)。 当你最大化它们时,你的窗户是不是已经填满了整个屏幕?

即使在具有多个显示器的机器上,也不能将工作区域设置为跨越多个显示器。 MSDN文档说,它被限制为设置包含指定矩形的监视器的工作区域:

在具有多个显示监视器的系统中,该功能设置包含指定矩形的监视器的工作区域。