2017-04-11 57 views
3

我編寫了一個小程序來跟蹤我的剪貼板活動並使用反應香蕉和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上運行這個。 任何幫助將是偉大的!

乾杯

+0

適用於Windows 10 64bit,stackage 1.3.2,ghci 8.0.1。 ''直接在ghci工作中做getClipboardString'嗎? –

+0

是的,當我在ghci中使用剪貼板功能時,一切都按預期工作。我會比較今天晚些時候的版本,看看它是不是原因, –

+0

@ja。你能給我你在終端上輸入的命令嗎?我的版本與您的版本相同,但仍然無效。 –

回答

0

經過一些研究,我相信我找到了問題的原因。發生了什麼事情是,當我將新文本複製到剪貼板時,程序鎖定了程序,因此不會發生其他更改。在此鎖定時間內,我的程序試圖訪問剪貼板併發生錯誤。爲了解決這個問題,我使用Either使用try來自Control.Exception將呼叫打包爲getClipboardString,然後模式匹配錯誤。

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