Подтвердить что ты не робот

Определите, какой процесс блокирует буфер обмена

У меня есть своеобразная ошибка, когда какой-то процесс иногда использует буфер обмена, когда мое приложение переходит на операции копирования и вставки. Есть несколько попыток работы вокруг, и у меня есть приемлемое решение на месте, но я хотел бы найти, какой процесс это происходит, если ошибка возникает снова.

4b9b3361

Ответ 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();
}