如何检查剪贴板中的哪个应用程序?


8

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

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

我们怎么调试呢?有没有可以监控的工具?AFAIK ProcMon不能胜任这项工作。

机器是Windows XP。


这是否在最小启动配置中发生?
Ramhound 2014年

机器人软件无法在安全模式下工作,这是困难之一
ÁxelCostasPena 2014年

1
我没有说安全模式我说在最小启动配置中存在差异。
Ramhound 2014年

手动剪贴板:将文本保存到文件,调用该文件中的文本,删除文件。
Wutnaut 2014年

@Ramhound机器有很多组件,其中很多都是机器人活动所需要的。从干净的机器开始,逐个安装软件,直到重现错误将是非常昂贵的。
ÁxelCostasPena 2014年

Answers:


7

剪贴板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#函数可以在帖子 获取剪贴板所有者标题/标题中找到


因为在我们的场景中,我们可以确保任何正在执行该操作的进程没有创建窗口,我将其标记为正确答案。谢谢。
ÁxelCostasPena 2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.