最近,我一直试图从托管代码调用SystemParametersInfo
方法,但没有任何成功。
问题是,在调用方法之后,该方法返回false
(表示失败),但是GetLastError
(由Marshal.GetLastWin32Error()
检索)是0
。
我尝试从C ++调用该方法作为测试(具有完全相同的参数),并且从那里完全正常。
方法的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位可执行文件。
我完全在我的智慧结束时,你知道我可能做错了什么吗?
答案 0 :(得分:4)
正如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;