Использование SystemParametersInfo из C# (SPI_GETSCREENREADER SPI_SETSCREENREADER)

Я делаю это правильно?

[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);
}

2 ответа

Решение

Объявление 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, когда вы получаете ложное возвращение, чтобы сбой не молчал.

Основываясь на этой статье, последний параметр SystemParametersInfo должен быть:

int SPIF_SENDCHANGE = 0x02;

При изменении значения.

Другие вопросы по тегам