确定锁定剪贴板的进程

我有一个特殊的错误,当我的应用程序去处理复制和粘贴操作时,某些进程偶尔会出现使用剪贴板。 有一些重试工作,我有一个可接受的解决方案,但我想找到错误再次发生的过程。

我把我的解决方案包装成一个易于使用的方法(以及一些声明):

[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); } 

请享用!

这是一个类似的解决方案,但这会为您提供一个可以向用户显示的字符串:

 [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(); } 

基于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(); } 

要诊断这样的事情我建议从Process Explorer开始, http://technet.microsoft.com/en-us/sysinternals/bb896653