Events tcl/tk观察剪贴板

Events tcl/tk观察剪贴板,events,asynchronous,tcl,clipboard,notify,Events,Asynchronous,Tcl,Clipboard,Notify,我想在剪贴板上放东西时执行一个函数(例如strg+c) 如何在TCL/TK中观察剪贴板,以便在有内容出现时处理通知(事件驱动) 我做了一些研究,之后的命令与我所看到的不太一样 proc observeClipboard {} { set lClipboardContent [clipboard get] # do something with clipboard content after 1000 observeClipboard } 它不能

我想在剪贴板上放东西时执行一个函数(例如strg+c)

如何在TCL/TK中观察剪贴板,以便在有内容出现时处理通知(事件驱动)

我做了一些研究,之后的
命令与我所看到的不太一样

proc observeClipboard {} {

        set lClipboardContent [clipboard get]
        # do something with clipboard content
        after 1000 observeClipboard
}

它不能按预期工作,也不是一个事件驱动(更平滑)的解决方案。

最简单的方法可能是始终拥有剪贴板选择。
这有几个缺点:您负责剪贴板,并且一些剪贴板内容可能会丢失,因此这不是防弹的

proc readclip {} {
    after 50 {
        puts [set cnt [clipboard get]]
        clipboard clear
        clipboard append $cnt
        selection own -command readclip -selection CLIPBOARD .
        selection handle . [list string range $cnt]
    }
}
selection own -command readclip -selection CLIPBOARD .
调用
readclip
时,新应用程序已请求对剪贴板的所有权,但它尚未拥有所有权,因此我们需要等待一段时间,让它获取所有权,设置所有内容等


另请注意,如果有多个应用程序执行此操作,则两个应用程序都会为剪贴板的所有权“战斗”,这是一件坏事。

AFAIK,在X服务器上,有一个应用程序保留剪贴板选择。如果检索所选内容,将要求此应用程序提供数据。它可以在任何时候更改数据,因此,即使选择所有者没有更改,剪贴板的“内容”也可以更改。可以用多种格式检索剪贴板,但要正确操作并非易事。选择和剪贴板管理是ICCCM的一部分,这是有充分理由的,并非所有应用程序在所有情况下都能做正确的事情。(我很确定Tk有时会出错,但在过去几年中没有时间去追查剩余的问题。)非常感谢。我现在想买就买。