我编写了一个小程序来跟踪我的剪贴板事件,并使用 react-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 (Thread does not have a clipboard open.) 。我在 Windows 上运行它。
任何帮助都会很棒!

干杯

最佳答案

经过一番研究,我相信我找到了问题的原因。发生的事情是,当我将新文本复制到剪贴板时,程序锁定了该程序,因此不会对其进行其他更改。在此锁定时间内,我的程序尝试访问剪贴板并出错。为了解决这个问题,我使用 getClipboardString 中的 Eithertry 的调用包装在 Control.Exception 中,然后模式匹配了错误。

c <- try getClipboardString :: IO (Either SomeException (Maybe String))
case c of
    Left err -> loop s (epop, epush) --ignore
    Right clip -> --do something usefull

关于windows - 从剪贴板读取时权限被拒绝,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43347582/

10-14 11:37