2

我这样做正确吗?

[DllImport("user32", CharSet = CharSet.Auto)]
internal static extern long SystemParametersInfo(long uAction, int lpvParam, ref bool uParam, int fuWinIni);

...

public static bool IsScreenReaderRunning()
{
    long SPI_GETSCREENREADER = 70L;
    bool bScreenReader = false;
    long retVal;

    retVal = SystemParametersInfo(SPI_GETSCREENREADER, 0, ref bScreenReader, 0);

    //uint iParam = 0;
    //uint iUpdate = 0;
    //bool result = false;
    //bool bReturn = SystemParametersInfo(SPI_GETSCREENREADER, iParam, &bScreenReader, iUpdate);
    return bScreenReader;
}

public static void ScreenReaderOn()
{
    long SPI_GETSCREENREADER = 71L;
    bool bScreenReader = true;
    long retVal;

    retVal = SystemParametersInfo(SPI_GETSCREENREADER, 0, ref bScreenReader, 0);
}

public static void ScreenReaderOff()
{
    long SPI_GETSCREENREADER = 71L;
    bool bScreenReader = false;
    long retVal;

    retVal = SystemParametersInfo(SPI_GETSCREENREADER, 0, ref bScreenReader, 0);
}
4

2 回答 2

5

pinvoke 声明完全错误,它是从 VB6 代码复制而来的。返回类型和参数不长(VB6 int32 类型),它们是 int。Pinvoke.net 是一个获得良好声明的好网站。

[DllImport("user32.dll", SetLastError = true)]
static extern bool SystemParametersInfo(int uiAction, int uiParam, IntPtr pvParam, int fWinIni);

当你得到一个错误的返回时,不要忘记抛出 Win32Exception ,这样失败就不会沉默。

于 2011-03-25T16:04:06.347 回答
0

根据这篇文章,SystemParametersInfo 的最后一个参数应该是:

int SPIF_SENDCHANGE = 0x02;

更改值时。

于 2011-03-25T15:55:47.307 回答