表单标题栏按钮问题

时间:2013-06-06 10:52:55

标签: c# .net winforms

Is there a way to check when mouse is above standard window control buttons (close, minimize etc)?

这段代码不是我的。我通过上面的链接,根据我的要求做了一些改动。我试图编写鼠标输入和输入鼠标离开事件最小化& 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 (异步)方法而不重复。因为如果我使用 reader.speak (同步),它将等待处理直到它完成阅读文本。
  2. 我还需要实现鼠标离开事件。因为如果鼠标离开按钮,我想要调用 reader.Dispose()方法。有没有办法实现鼠标离开事件?
  3. 请帮忙。

1 个答案:

答案 0 :(得分: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,所以我不知道我是否正确使用它,check the manual yourself。您可以在处理表单时处置_reader

您还可以使用变量,常量,枚举,资源或任何您喜欢的内容替换字符串,您可以将if换成switch,换句话说:这不是副本&安培;粘贴代码,但我希望你能抓住一般的想法。

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