2013-07-20 7 views
2

У меня есть этот кусок кода в моей программе клонирования «Блокнот», это отслеживать местоположение моего карата в моем RichTextBox и отлично работает для меня.Как я могу исправить эту ошибку Esc Key?

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(); 
     } 
    } 

EDIT: Это где есть проблема:

index = richTextBox1.SelectionStart;

Когда я делаю это, я могу запустить мою программу тонкой, тип текст в моем RichTextBox и все, но когда я нажимаю Esc ключ он говорит:

не может получить доступ, расположенный объект имени объекта: «R ichTextBox»

Тогда это говорит:

Поиск и устранение неисправностей Советы: Убедитесь, что вы не выпустили ресурс, прежде чем использовать это. Получить общую помощь по этому поводу

Любые идеи о том, что я могу сделать? Я попытался использовать клавиши быстрого доступа, но у него нет клавиши Esc, которую вы можете использовать для ярлыка. Любая помощь при выполнении другого ярлыка или исправления этой проблемы, я бы хотел!

ответ

2

Try:

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); 
    }