2012-05-12 3 views
1

У меня есть проблема, и я столкнулся только с двумя или тремя сообщениями в Интернете об этом: когда я использую буфер обмена в приложении C# (Clipboard.SetText или Clipboard.Clear), Chrome случайным образом уже использует его, поэтому мой запрос буфера обмена не удался.Google Chrome крадет буфер обмена

System.Runtime.InteropServices.ExternalException: Requested Clipboard operation did not succeed. 
    at System.Windows.Forms.Clipboard.ThrowIfFailed(Int32 hr) 
    at System.Windows.Forms.Clipboard.SetDataObject(Object data, Boolean copy, Int32 retryTimes, Int32 retryDelay) 
    at System.Windows.Forms.Clipboard.SetText(String text, TextDataFormat format) 
    at System.Windows.Forms.Clipboard.SetText(String text) 

Я закрываю Chrome, он работает, затем снова открывается Chrome, и через несколько минут он все еще не работает. Я использую следующий код с 1 секундным таймером и GetOpenClipboardWindow(), другой PInvoke :(, чтобы подтвердить, что это действительно Chrome, который меня раздражает:

[DllImport("user32.dll")] 
    static extern IntPtr GetOpenClipboardWindow(); 

    [DllImport("user32.dll", SetLastError = true)] 
    static extern int GetWindowThreadProcessId(IntPtr hWnd, out int 
    lpdwProcessId); 


    IntPtr hwnd = GetOpenClipboardWindow(); 
    if (hwnd != IntPtr.Zero) 
    { 
     int processId; 
     GetWindowThreadProcessId(hwnd, out processId); 
     Process p = Process.GetProcessById(processId); 
     listBox1.Items.Add(p.Modules[0].FileName); 
    } 

ли кто-нибудь из вас уже была такая проблема? вы знаете, почему Chrome крадет буфер

[Редактировать]

в любой из членов команды Chrome: Уважаемый разработчик, если вы читаете это сегодня, дают мне Clipboard назад, как у меня больше прав, чем вы на моем буфере обмена. Я искал два дня из-за вас.

+1

Кажется странным. Возможно, это дополнения к Chrome, которые это делают? Это происходит на других машинах? –

+1

Также случилось с этим парнем: http://code.google.com/p/chromium/issues/detail?id=86765 –

ответ

3

Боюсь, нечего делать, если в другом процессе открыт буфер обмена, нет способа освободить его, пока этот процесс не закроет его.

+0

Правильно. Кажется, единственное, что я мог сделать, - это обработать эту ошибку и дождаться, когда Chrome сделает все возможное. Когда это занимает слишком много времени, я говорю пользователю перезапустить или закрыть виноватую программу. –

0

Убедитесь, что ваше приложение (потому что в конечном счете это все, что вы можете контролировать) играет по правилам. Убедитесь, что вы не выполняете несколько операций открытия/закрытия, когда будете делать это. Например, если вы размещаете несколько форматов в буфер обмена, убедитесь, что вы инкапсулируете в ONE open/close блок, а не два. Всякий раз, когда вы закрываете буфер обмена после обновления, он генерирует уведомления буфера обмена, которые запускают другие приложения (которые контролируют буфер обмена), чтобы посмотреть на новые данные. Поэтому убедитесь, что вы генерируете ОДНО такое событие (не многократно) для каждой предполагаемой операции. Не создавайте непреднамеренные операции (т. Е. Не открывайте и не закрывайте буфер обмена для его запуска при запуске приложения). И если вы только что обновили буфер обмена, не ожидайте, что вы сразу сможете прочитать буфер обмена, не нападая на головы с другими приложениями, которые реагируют на уведомления из окон (wm_DrawClipboard и т. Д.).

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