Использование SystemParametersInfo из C # (SPI_GETSCREENREADER SPI_SETSCREENREADER) - PullRequest
2 голосов
/ 25 марта 2011

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

[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 ]

3 голосов
/ 25 марта 2011

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

0 голосов
/ 25 марта 2011

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

int SPIF_SENDCHANGE = 0x02;

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

...