1

有没有办法检查鼠标何时高于标准窗口控制按钮(关闭、最小化等)?

这段代码不是我的。我浏览了上面的链接,并根据我的要求进行了一些修改。我正在尝试在 C# 中为最小化和关闭表单按钮编写鼠标进入和鼠标离开事件?

    SpeechSynthesizer reader;
    internal const int WM_NCMOUSEMOVE = 0x00A0;

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_NCMOUSEMOVE)
        {
            //Mouse over on Minimize button
            if ((int)m.WParam == 0x8)
            {
                reader = new SpeechSynthesizer();
                reader.SpeakAsync("Minimize button");
            }

            //Mouse over on Maximize button
            if ((int)m.WParam == 0x9)
            {
                reader = new SpeechSynthesizer();
                reader.SpeakAsync("Maximize button");
            }

            //Mouse over on Close button
            if ((int)m.WParam == 0x14)
            {
                reader = new SpeechSynthesizer();
                reader.SpeakAsync("Close button");
            }
        }

        base.WndProc(ref m);
    }

我的问题:

  1. 如何不重复使用reader.SpeakAsync (Asynchronous) 方法。因为如果我使用reader.speak(同步),它将等待进程直到它完成阅读文本。
  2. 我还需要实现鼠标离开事件。因为如果鼠标离开按钮,我确实想调用reader.Dispose()方法。有没有办法实现鼠标离开事件?

请帮忙。

4

1 回答 1

3

WndProc应该只翻译 Win32 消息并将它们发送到您的程序逻辑。例如:

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_NCMOUSEMOVE)
    {
        //Mouse over on Minimize button
        if ((int)m.WParam == 0x8)
        {
            Speak("Minimize button");
        }
        else if ((int)m.WParam == 0x9)
        {
            Speak("Maximize button");
        }
        else ...

    }

    ...
}

private SpeechSynthesizer _reader;

void Speak(string toSpeak)
{
    if (_reader == null)
    {
        _reader = new SpeechSynthesizer();
    }

    _reader.SpeakAsync(toSpeak);
}

不知道这个类的API,所以不知道自己用的好不好,自己查手册。您可以在处置_reader表单时处置。

你也可以用变量、常量、枚举、资源或任何你喜欢的东西来替换字符串,你可以把if's 换成 a switch,换句话说:这不是复制和粘贴代码,但我希望你能理解一般的想法。

只是好奇,你在建什么?这个功能不是已经存在于操作系统中了吗?如果每个程序都必须自己实现可访问性,那将是一种耻辱。

于 2013-06-06T12:42:30.027 回答