C# 调用系统参数INFO时出现问题

C# 调用系统参数INFO时出现问题,c#,.net,windows,winapi,pinvoke,C#,.net,Windows,Winapi,Pinvoke,最近,我一直试图从托管代码中调用SystemParametersInfo方法,但没有成功 问题是,调用该方法后,该方法返回false(表示失败),但是GetLastError(由marshall.GetLastWin32Error()检索)是0 我试图从C++中调用这个方法作为测试(用完全相同的参数),并且从那里完全可以工作。< /P> 该方法的p/Invoke声明如下: [DllImport("user32.dll", SetLastError = true)] [return: Marsha

最近,我一直试图从托管代码中调用
SystemParametersInfo
方法,但没有成功

问题是,调用该方法后,该方法返回
false
(表示失败),但是
GetLastError
(由
marshall.GetLastWin32Error()
检索)是
0

我试图从C++中调用这个方法作为测试(用完全相同的参数),并且从那里完全可以工作。< /P> 该方法的p/Invoke声明如下:

[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool SystemParametersInfo(SPI uiAction, int uiParam, ref STICKYKEYS pvParam, SPIF fWinIni);

internal struct STICKYKEYS 
{
  public int cbSize;
  public int dwFlags;
}
调用如下:

NativeMethods.STICKYKEYS stickyKeys = default(NativeMethods.STICKYKEYS);
bool result = NativeMethods.SystemParametersInfo(NativeMethods.SPI.SPI_GETSTICKYKEYS, StickyKeysSize, ref stickyKeys, 0);
int error = Marshal.GetLastWin32Error();
SPI.SPI_GETSTICKYKEYS
0x003A
(如MSDN上所示)

这里的结果是
false
,返回的错误是
0

如果这很重要的话,它也将作为64位可执行文件进行编译


我完全不知所措了,你知道我可能做错了什么吗?

正如GSerg向我指出的,我的问题是我需要将结构的大小直接作为参数传递,以及作为通过引用传递的结构的
cbSize
成员传递。 正确的代码是:

        int stickyKeysSize = Marshal.SizeOf(typeof (NativeMethods.STICKYKEYS));
        NativeMethods.STICKYKEYS stickyKeys = new NativeMethods.STICKYKEYS {cbSize = stickyKeysSize, dwFlags = 0};
        bool result = NativeMethods.SystemParametersInfo(NativeMethods.SPI.SPI_GETSTICKYKEYS, stickyKeysSize, ref stickyKeys, 0);
        if (!result) throw new System.ComponentModel.Win32Exception();
        return stickyKeys;

这不是一个真正的答案,但您是否查看了says,将此结构的
cbSize
成员和
uiParam
参数设置为
sizeof(粘滞键)
。你在这样做吗?@Benj看起来粘滞键不在那里。@GSerg我正在尝试先读取值(这就是为什么用SPI_GETSTICKYKEY调用函数)。Afaict,在这种情况下,pvParam应作为输出参数。(基本上,我正在尝试用C#::重新实现这个片段)@GSerg-Yup!我已经设置了cbSize参数,它似乎工作正常。在我的辩护中,我已经将结构的大小传递给了函数,所以我没想到我需要传递两次:)。谢谢你的帮助!