【问题标题】:Determine which process is locking the clipboard确定哪个进程正在锁定剪贴板
【发布时间】:2012-09-25 18:25:55
【问题描述】:

我有一个特殊的错误,当我的应用程序处理复制和粘贴操作时,某些进程偶尔会使用剪贴板。有一些重试解决方法,我有一个可以接受的解决方案,但如果错误再次发生,我想确定是哪个进程。

【问题讨论】:

  • 虽然我同意这个问题的观点,但您究竟会如何处理这些信息?即使这是可能的(而且,我不确定是不是),你也无能为力。 (杀死进程?没有机会!)
  • @mike 你可以发一条消息让用户知道吗?它可以是用户直接控制的进程。
  • @mickeyf 即使你这样做了,我作为用户应该怎么做? 没有锁定剪贴板,除了关闭任何锁定它的程序之外,我无法解锁它(而且,因为我正在努力完成我的工作,你可以忘记这一点。)
  • @Mike:这只是诊断中的一个步骤。如果它是我们可以删除或更新的用户机器上的应用程序,那么它会处理整个事情。我宁愿解决根本原因而不是再担心它,而不是围绕其他一些过程进行编程。
  • @Richard,您应该添加您的解决方案作为答案。

标签: c# .net


【解决方案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】:

基于 Jeff Roe 的回答,但显示了如何获取文本长度,因此可能 > 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

    【讨论】:

    • 谢谢,但我和用户都没有时间监控这样的事情。不管怎样,我找到了我要找的东西。
    • @RichardPianka:如果你找到了你要找的东西,请在这里分享。 SO 是一条双向街道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 2011-01-29
    • 2019-11-27
    • 2010-10-26
    • 2013-08-26
    相关资源
    最近更新 更多