2013-07-20 34 views
2

我在記事本克隆程序中有這段代碼,它是在我的RichTextBox中跟蹤我的克拉位置,並且一直在爲我工作。我該如何解決這個Esc鍵錯誤?

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鍵,它說:

無法訪問釋放的對象 對象名稱:「R ichTextBox」

然後是說:

故障排除提示: 確保您嘗試使用此之前,還沒有公佈的資源。 獲取此異常的一般幫助

關於我能做什麼的任何想法?我嘗試使用快捷鍵,但沒有可用於快捷鍵的Esc鍵。任何幫助或者做一個不同的捷徑或解決這個問題,我希望它!

回答

2

嘗試:

Application.Exit(); 

代替

this.Close(); 

從MSDN:

Application.Exit

通知所有消息泵噸嘿必須終止,然後關閉消息處理後的所有應用程序窗口。如果您調用了Application.Run(WinForms應用程序),則這是要使用的代碼,此方法將停止所有線程上的所有正在運行的消息循環,並關閉應用程序的所有窗口。

+0

對不起,不張貼我的錯誤顯示的地方,請參閱我的上次編輯。 – Dozer789

+0

你試過這個嗎? – Shaharyar

+0

我做錯了,當我第一次嘗試它,並沒有工作,只是試了一遍,它的工作......不知道我做錯了什麼。 – Dozer789

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); 
    } 
相關問題