我们正在部署一些带有机器人软件的虚拟机,这些软件可以在浏览器中执行操作,但在访问剪贴板进行读取或写入时,有些虚拟机遇到了问题。它们显示“无法打开剪贴板”。
因此有任何其他应用程序持有剪贴板。
我们如何调试它?有没有什么工具可以监控它?据我所知进程监控不起作用。
机器是Windows XP。
答案1
Clipboard 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
可以在帖子中找到类似的 C# 函数 获取剪贴板所有者的标题/标题。
答案2
相关问题及解决方案:复制粘贴功能在 Windows 7 上不再起作用
对我有用的是下载GetOpenClipboardWindow.zip
该工具帮助我找到锁定剪贴板的程序(VirtualBox)。