我这样做正确吗?
[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);
}发布于 2011-03-26 00:04:06
pinvoke声明是完全错误的,它是从VB6代码复制过来的。返回类型和参数不是长整型( VB6 int32类型),它们是整型的。Pinvoke.net是一个很好的获取声明的站点。
[DllImport("user32.dll", SetLastError = true)]
static extern bool SystemParametersInfo(int uiAction, int uiParam, IntPtr pvParam, int fWinIni);当你得到一个错误的返回值时,不要忘了抛出Win32Exception,这样失败就不会消失了。
发布于 2011-03-25 23:55:47
根据这个article,SystemParametersInfo的最后一个参数应该是:
int SPIF_SENDCHANGE = 0x02;当更改该值时。
https://stackoverflow.com/questions/5434709
复制相似问题