2013-12-20 3 views
1

Я разработал приложение, которое перехватывает все Clipboard текста:Winform приложения случайные сбои

protected override void WndProc(ref Message m) 
{ 
    try 
    { 
     switch (m.Msg) 
     { 
      case WM_DRAWCLIPBOARD: 
      { 
       if (Clipboard.GetText() != string.Empty) 
        //I analyze the data then 
        if (ClipboardObject.CheckNewData(Clipboard.GetText())) 
         ClipboardObject.UpdateClipboardData(Clipboard.GetText()); 

       SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam); 
       break; 
      } 
      case WM_CHANGECBCHAIN: 
       if (m.WParam == nextClipboardViewer) 
        nextClipboardViewer = m.LParam; 
       else 
        SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam); 
       break; 

      default: 
       base.WndProc(ref m); 
       break; 
     } 
    } 
    catch (Exception ex) 
    { 
    } 
} 

Когда событие взошло, я заполнить данные в объекте, который является общим для всей моего приложения, то таймер, который клещи каждую половину секунды я продолжаю проверять, есть ли новые данные в этом объекте.

На каждом компьютере я установил это приложение на странные вещи начинают происходить с окнами, даже когда мое приложение не работает:

  • Windows, продолжает врезаться случайно
  • На окнах некоторых PC мини-сублимационной происходит (случается со мной каждый раз)
  • когда-то окна будут врезаться, как только я нажимаю мышь правой кнопкой мыши на любую папку или файл

я боролся с эти проблемы в течение длительного времени, и я действительно не могу найти решение моей проблемы, любая помощь приветствуется.

+0

Я не вижу COM здесь? – Thorarin

+0

* даже когда мое приложение не работает * похоже, что вы забыли удалить установленный крючок. – Sinatr

+0

Можете ли вы сказать мне, как снять крючок? Означает ли это, что каждый раз, когда я запускаю приложение, я прикрепляю крючок, так что это означает, что есть несколько запусков или только один крюк может быть присоединен только? Есть ли все равно, чтобы проверить, есть ли уже крюк? – ykh

ответ

3

«Каждое окно, которое принимает сообщение WM_DRAWCLIPBOARD, должно вызвать функцию SendMessage, чтобы передать сообщение в следующее окно в цепочке просмотра буфера обмена». Вы уверены, что всегда происходит? У вас должна быть попытка ... наконец, блокировать там (на самом деле, GetText, вероятно, бросает, если данные не являются текстовыми).

WM_CHANGECBCHAIN также может быть очень сложным - вы очищаете после себя на выходе приложения? Вам нужно снова удалить себя с помощью ChangeClipboardChain, иначе вы оставите свисающий указатель в цепочке буфера обмена!

В основном, когда ваша форма закрывается (и это ручка становится расположена - но прежде, чем она действительно расположена), вам нужно вызвать что-то вроде этого:

ChangeClipboardChain(this.Handle, nextClipboardViewer); 

Изменения буфера обмена чрезвычайно хрупкий - это сбой приложения может оставить вас сломанным буфером обмена. В .NET, по крайней мере, попробуйте использовать финализатор, чтобы избавиться от этого (даже тогда это будет сложно) - на самом деле, может быть, не совсем плохая идея привязать буфер обмена к чему-то другому, а не к вашему фактическому окну (так что вы можете правильно реализовать шаблон dispose-finalize), но это зависит от вас. Кроме того, увидеть этот вопрос: Can aborting a process without resetting the clipboard chain cause trouble?

Обратите внимание, что даже тогда, кто-то может просто обработать убить приложение (это одна из причин, почему Task Manager предупреждает вас не убивать процессы - в этом случае, это действительно будет сделать свой приложение нестабильно). Тройка-проверьте все, чтобы убедиться, что вы выбрали цепочку CB во всех возможных сценариях (за исключением неизбежного процесса kill - есть способы исправить это даже в некотором роде, но эй, если пользователь находится в заднице, пусть он) , иначе вы собираетесь оставить свой компьютер очень неустойчивым.

+0

Ваша информация очень полезна, я попробую все, что вы отметили, и, надеюсь, она будет работать – ykh

Смежные вопросы