2017-02-09 11 views
2

저는 haskell과 gtk2hs를 사용하고 있습니다.haskell에서 keydown 및 keyup 이벤트를 얻으려면 어떻게해야합니까?

keydown/keyup 이벤트를 가져 오는 방법이 있습니까? (keystate도 마찬가지로 좋고 keypress 이벤트는 그렇지 않습니다)?

+1

http://hackage.haskell.org/package/gtk-0.14.6/docs/Graphics-UI-Gtk-Abstract-Widget.html#v:onKeyRelease? – leftaroundabout

+0

그건 작동합니다. 그것을 발견하지 못했습니다. –

+3

좋습니다. 솔루션을 스스로 답변으로 게시하는 것을 고려하십시오. 이것은 다른 사람들에게 아주 유용 할 수 있습니다. – leftaroundabout

답변

3

이 수입이 필요합니다

import Graphics.UI.Gtk.Abstract.Widget 
import Graphics.UI.Gtk.Gdk.Events 

다음이 keyRelease 이벤트 (일부 간단한 예)에 대응하는 방법입니다 : 많은이 패턴이 필수적없는 정보를 포함 할 것 무시

let handler event = do 
    case event of 
     (Key _ _ _ _ _ _ _ _ _ (Just char)) -> case char of 
      'a' -> doSomething 
      _ -> return() --or whatever type the other cases have 
     _ -> return() 
    return True 

onKeyRelease widget handler 

간단한 이벤트 핸들러. 다음은 키가 해제 또는 눌렀는지 여부를 포함 출시

isPressedA <- newIORef False 
let handler event = do 
    case event of 
     (Key released _ _ _ _ _ _ _ _ (Just char)) -> case char of 
      'a' -> writeIORef isPressedA (not released) 
      _ -> return() 
     _ -> return() 
    return True 

onKeyPress window handler 
onKeyRelease window handler 

를, 그래서 동일한 핸들러는 모두 이벤트에 대해 작업 할 수 있습니다

는 여기에 키의 상태를 추적 할 수있는 방법입니다.

는 내가 키 누름을 방지하기 위해, 오히려 일부 위젯 '보다, 윈도우의 주요 이벤트에이 코드 응답을 만들어 keyRelease이를 keyDown을 받고

(이벤트 사이의 창을 전환 할 때 그래도 여전히 가능) 다른 위젯에 등록 이벤트는 마지막 keyPress 이후 keyRelease가 있었는지 여부를 추적하여 수행 할 수 있습니다.

+0

안녕하세요, 귀하의 솔루션을 사용하여 키 이벤트를 얻으려고하고 있지만 Cabal을 사용하여 Graphics.UI.Gtk.Abstract.Widget 및 Events를 설치하는 방법을 모르겠습니다. 거기에 패키지 이름을 찾지 못했습니다. 저를 도와 줄 수 있습니까? 또한, 코드의이 부분은 Main에서 사용됩니다. 감사 – alitalvez