gpt4 book ai didi

c# - 无法调用 SystemParametersInfo

转载 作者:可可西里 更新时间:2023-11-01 14:13:36 28 4
gpt4 key购买 nike

最近我一直在尝试从托管代码调用 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_GETSTICKYKEYS0x003A(如 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;

关于c# - 无法调用 SystemParametersInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31078694/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com