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)
以下代码应该可以正常工作:
// 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文档说,这是受限于设置,包含指定的矩形显示器的工作区域:
在具有多个显示监视器的系统中,该功能设置包含指定矩形的监视器的工作区域。
| 归档时间: |
|
| 查看次数: |
5783 次 |
| 最近记录: |