如何检查剪贴板持有哪个应用程序?

Áxe*_*ena 9 windows clipboard monitoring

我们正在部署一些带有在浏览器中执行操作的机器人软件的虚拟机,并且在访问剪贴板进行读取或写入时我们遇到了一些问题。他们显示“无法打开剪贴板”。

所以还有任何其他应用程序持有剪贴板。

我们如何调试它?有什么工具可以监控吗?AFAIK ProcMon不能完成这项工作。

机器是Windows XP。

har*_*ymc 10

剪贴板 API 可追溯到 Windows 3.0(或之前?)并且设计得很糟糕。不幸的是,它没有使用 get/set 原语,而是使用 open/close,这使得应用程序有可能保持其访问太久。Vista 对查看者链的处理进行了一些改进,但没有新的 API。

使用现有的 API,只有当剪贴板的所有者也至少有一个打开的窗口时,才有可能识别该所有者。如果房主没有窗户,那么就倒霉了。

在线程为什么我的剪贴板停止工作?, Jay Parzych 贡献了以下 vbs 代码,其中 GetClipboardLocker 函数返回保存剪贴板的进程的文件名:

<DllImport("user32.dll")> _
Public Function GetOpenClipboardWindow() As IntPtr
   End Function
 <DllImport("user32.dll", SetLastError:=True)> _
   Public Function GetWindowThreadProcessId(ByVal hWnd As IntPtr, ByRef lpdwProcessId As Integer) As Integer
   End Function
Public Function GetClipboardLocker() As String
       Dim hwnd As IntPtr = GetOpenClipboardWindow()
       If hwnd <> IntPtr.Zero Then
           Dim processId As Integer
           GetWindowThreadProcessId(hwnd, processId)
           Dim p As Process = Process.GetProcessById(processId)
           GetClipboardLocker = p.Modules(0).FileName
       Else
           GetClipboardLocker = String.Empty
       End If
   End Function
Run Code Online (Sandbox Code Playgroud)

类似的 C# 函数可以在 Get Clipboard Owners Title/Caption 一文中找到