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

Jel*_*eer 4 .net c# windows pinvoke winapi

我已经尝试了很长时间以调整桌面工作区(最大化Windows的区域)的大小。我已经找到了所需的API,但似乎无法调整工作区的大小。它什么也没做。

我使用Windows 7 Ultimate x64,所以我也尝试在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);
}
Run Code Online (Sandbox Code Playgroud)

Cod*_*ray 5

以下代码应该可以正常工作:

// 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;
}
Run Code Online (Sandbox Code Playgroud)

但我不确定自己要做什么。默认情况下,工作区是系统任务栏或应用程序桌面工具栏未遮挡的屏幕部分。您将无法使其大于屏幕上可用的区域(不过,如果可以的话,这是个绝妙的选择!)。最大化窗口时,窗口是否还没有填满整个屏幕?

即使在具有多台显示器的机器上,也无法将工作区域设置为跨越多台显示器。在MSDN文档说,这是受限于设置,包含指定的矩形显示器的工作区域:

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