Использование 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;
При изменении значения.