2017-02-09 12 views
2

私はgtk2hsとhaskellを使用しています。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 

リリースは、キーがリリースされたり押されたかどうかを含んでいるため、同じハンドラは、両方のイベントのために働くことができます:ここで

は、キーの状態を追跡することができる方法です。

私はKeyDownイベントを取得

(イベント間のウィンドウを切り替えたとき、それはしかし、まだ可能です)別のウィジェットに登録KeyPressイベントとkeyReleaseを避けるために、ウィンドウのキーイベントではなく、いくつかのウィジェットに、このコードの応答を作りましたイベントは、最後のkeyPressからkeyReleaseがあったかどうかを追跡することによって行うことができます。

+0

こんにちは、あなたのソリューションを使用してキーイベントを取得しようとしていますが、Cabalを使用してGraphics.UI.Gtk.Abstract.WidgetとEventsをインストールする方法がわかりません。パッケージ名が見つかりませんでした。それを手伝ってもらえますか?また、コードのこの部分はメインになります。ありがとう – alitalvez

関連する問題