【问题标题】:Using SystemParametersInfo from C# (SPI_GETSCREENREADER SPI_SETSCREENREADER)使用 C# 中的 SystemParametersInfo (SPI_GETSCREENREADER SPI_SETSCREENREADER)
【发布时间】:2015-02-06 21:05:29
【问题描述】:

我这样做对吗?

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

【问题讨论】:

  • 上面的代码不适合你吗?

标签: c# user32


【解决方案1】:

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,这样失败就不会沉默。

【讨论】:

  • 汉斯,非常感谢您的回复。我仍然无法让它工作。我只需要一个有效的 SPI_GETSCREENREADER 方法——只是一个 C# 方法来检查读者。你有一个工作的例子吗?我似乎无法从 C# 中得到它的任何变体。我在 IntPtr 中传递了什么??
  • 您可以在 pinvoke 声明中将其设为“ref int”。如果安装了阅读器,您将获得 1 个回报。
【解决方案2】:

基于这个article,SystemParametersInfo的最后一个参数应该是:

int SPIF_SENDCHANGE = 0x02;

更改值时。

【讨论】:

    猜你喜欢
    • 2011-04-09
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多