У меня есть своеобразная ошибка, когда какой-то процесс иногда использует буфер обмена, когда мое приложение переходит на операции копирования и вставки. Есть несколько попыток работы вокруг, и у меня есть приемлемое решение на месте, но я хотел бы найти, какой процесс это происходит, если ошибка возникает снова.
Определите, какой процесс блокирует буфер обмена
Ответ 1
Я завернул свое решение в простой в использовании метод (и некоторые объявления):
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr GetOpenClipboardWindow();
[DllImport("user32.dll", SetLastError = true)]
static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);
private static Process GetProcessLockingClipboard()
{
int processId;
GetWindowThreadProcessId(GetOpenClipboardWindow(), out processId);
return Process.GetProcessById(processId);
}
Наслаждайтесь!
Ответ 2
Здесь аналогичное решение, но это дает вам строку, которую вы можете показать пользователю:
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern IntPtr GetOpenClipboardWindow();
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern int GetWindowText(int hwnd, StringBuilder text, int count);
private string getOpenClipboardWindowText()
{
IntPtr hwnd = GetOpenClipboardWindow();
StringBuilder sb = new StringBuilder(501);
GetWindowText(hwnd.ToInt32(), sb, 500);
return sb.ToString();
}
Ответ 3
На основании ответа Джеффа Роя, но показывает, как получить длину текста, поэтому может быть > 500. Также обрабатывает случай, когда окно не найдено.
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern IntPtr GetOpenClipboardWindow();
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern int GetWindowText(int hwnd, StringBuilder text, int count);
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern int GetWindowTextLength(int hwnd);
private static string GetOpenClipboardWindowText()
{
var hwnd = GetOpenClipboardWindow();
if (hwnd == IntPtr.Zero)
{
return "Unknown";
}
var int32Handle = hwnd.ToInt32();
var len = GetWindowTextLength(int32Handle);
var sb = new StringBuilder(len);
GetWindowText(int32Handle, sb, len);
return sb.ToString();
}
Ответ 4
Чтобы диагностировать что-то подобное, я бы предложил начать с Process Explorer, http://technet.microsoft.com/en-us/sysinternals/bb896653