2

我的记事本克隆程序中有这段代码,它用于跟踪我的克拉位置,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 键关闭我的程序之前,它对我来说一直工作得很好。这是我的 Esc 键的代码:

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

编辑:这就是问题所在:

index = richTextBox1.SelectionStart;

当我这样做时,我可以很好地运行我的程序,在我的RichTextBox和所有内容中输入文本,但是当我按下 Esc 键时它说:

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

然后是说:

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

关于我能做什么的任何想法?我尝试使用快捷键,但它没有可用于快捷键的 Esc 键。任何有关执行不同快捷方式或解决此问题的帮助,我想要它!

4

2 回答 2

2

尝试:

Application.Exit();

代替

this.Close();

来自 MSDN:

应用程序.退出

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

于 2013-07-20T02:32:57.623 回答
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);
    }
于 2013-07-20T11:37:12.503 回答