从剪贴板读取时权限被拒绝。

4

我编写了一个小程序来追踪我的剪贴板活动,并使用reactive-banana和System.Clipboard在终端中打印它。

module Main where

import Reactive.Banana
import Reactive.Banana.Frameworks
import System.Clipboard
import Data.Maybe(fromJust)

main :: IO ()
main = do
    sources <- (,) <$> newAddHandler <*> newAddHandler
    network <- setupNetwork sources
    actuate network
    s <- getClipboardString
    loop s sources

loop s (epop, epush) = do
    c <- getClipboardString
    if s /= c then
        snd epush [fromJust c]
    else
        loop s (epop, epush)

setupNetwork (epop, epush) = compile $ do
    ePop <- fromAddHandler $ fst epop
    ePush <- fromAddHandler $ fst epush

    bStack <- accumB [""] $ (++) <$> ePush
    eStack <- changes bStack

    reactimate' $ fmap print <$> eStack

当我运行它时,我进入另一个窗口(比如Chrome)并复制一些文本。当我这样做时,我会收到 Main.hs:CloseClipboard:invalid argument(线程没有打开剪贴板。) 的错误信息。我在Windows上运行此程序。 非常感谢您的帮助! 祝好

在我的 Windows 10 64位系统中运行良好,使用的是 stackage 1.3.2 和 ghci 8.0.1。你能够在 ghci 中直接执行 do getClipboardString 吗? - ja.
是的,当我在ghci中使用剪贴板功能时,一切都按预期工作。我会在今天晚些时候比较版本,看看它是否是原因。 - Yotam Ohad
@ja. 你能告诉我你在终端中输入的命令吗?我的版本与你的相同,但它仍然无法工作。 - Yotam Ohad
哦,我只尝试了 do getClipboardString。我安装了 reactive-banana,也遇到了“权限被拒绝”的问题。 - ja.
1个回答

0
经过一番研究,我相信我找到了问题的原因。发生的情况是,当我将新文本复制到剪贴板时,程序锁定了程序,以便不会对其进行其他更改。在此锁定期间,我的程序尝试访问剪贴板并出现错误。为了解决这个问题,我使用Control.Exception中的try将对getClipboardString的调用包装在Either中,然后模式匹配错误。
c <- try getClipboardString :: IO (Either SomeException (Maybe String))
case c of
    Left err -> loop s (epop, epush) --ignore
    Right clip -> --do something usefull

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接