windows - Tilladelse nægtet, når du læser fra udklipsholder

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skrev et lille program til at spore mit udklipsholder og skrive det ud til terminalen ved hjælp af reaktive bananer og 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


Når jeg kører det, flytter jeg til et andet vindue (som krom) og kopierer nogle tekst. Når jeg gør det, får jeg Main.hs: CloseClipboard: invalid argument (Thread does not have a clipboard open.). Jeg kører dette på windows.
Enhver hjælp ville være fantastisk!


Skål

Bedste reference


Efter lidt forskning tror jeg, jeg fandt årsagen til problemet. Hvad der skete var, at da jeg kopierede en ny tekst til udklipsholderen lå programmet for programmet, så der ikke ville ske andre ændringer. I løbet af denne låsningstid forsøgte mit program at få adgang til udklipsholderen og fik en fejl. For at løse dette indpakede jeg opkaldet til getClipboardString med i Either ved hjælp af try fra Control.Exception og derefter matchede mønstret fejlene væk.


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