我该如何解决这个Esc Key错误?

时间:2013-07-20 02:29:40

标签: c# winforms keyboard-shortcuts richtextbox runtime-error

我在记事本克隆程序中有这一块代码,它是在RichTextBox跟踪我的克拉位置,并且对我来说一直很好。

private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
    {
        Curpos();
    }

    private static int EM_LINEINDEX = 0xbb;
    [DllImport("user32.dll")]
    extern static int SendMessage(IntPtr hwnd, int message, int wparam, int lparam);

    private void Curpos()
    {
        {
            int line, col, index;
            index = richTextBox1.SelectionStart;
            line = richTextBox1.GetLineFromCharIndex(index);
            col = index - SendMessage(richTextBox1.Handle, EM_LINEINDEX, -1, 0);
            Lblcurpos.Text = "Line: " + (++line).ToString() + ", Column:"  + (++col).ToString();
        }
    }

它一直很适合我,直到我添加了一些代码,以便我可以用Esc Key关闭我的程序。 这是我的Esc密钥的代码:

private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Escape)
        {
            this.Close();
        }
    }

编辑:这就是问题所在:

index = richTextBox1.SelectionStart;

当我这样做时,我可以正常运行我的程序,在RichTextBox中输入文字以及所有内容,但是当我按下Esc键时它会说:

  

无法访问已处置的对象   对象名称:'RichTextBox'

然后说:

  

故障排除提示:   在尝试使用此资源之前,请确保您尚未释放资源。   获取此异常的常规帮助

关于我能做什么的任何想法?我尝试使用快捷键,但它没有可用于快捷方式的Esc键。任何帮助,无论是做一个不同的快捷方式或修复这个问题,我想要它!

2 个答案:

答案 0 :(得分:2)

尝试:

Application.Exit();

而不是

this.Close();

来自MSDN:

Application.Exit

  

通知所有消息泵必须终止,然后在处理完消息后关闭所有应用程序窗口。如果您调用了Application.Run(WinForms应用程序),这是要使用的代码,此方法将停止所有线程上所有正在运行的消息循环并关闭应用程序的所有窗口。

答案 1 :(得分:1)

请注意,Application.Exit()是this.Close()的替代品。 Exit()终止整个应用程序,Close()只关闭表单。

有更好的方法来避免这样的事故。当您像处理快捷键击一样处理时,应始终将e.Handled和e.SuppressKeyPress设置为true,这样键击将完全被解除,并且不会生成任何其他事件。就像轰炸你的代码一样。

到目前为止,最好的方法是在Winforms,ProcessCmdKey()中使用专用方法。它实现了真正的快捷键击行为,KeyPreview属性是一个VB6兼容性功能,它很接近但不相同。看起来像这样:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
        if (keyData == Keys.Escape) {
            this.Close();
            return true;   // Used, don't process any further
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }