2009年04月21日

Silverlightからキー入力を受け取る

昨日の続きですが、なんとかSilverlightからキー入力を判別する方法が分かったので
ぱずぷれv3 uupaa-excanvas対応版をアップしました。
速さは昨日の通り(なぜかSilverlight使用時が5%くらい速くなってた)。
 
さて、SilverlightでJavaScirptを利用してキーイベントを取得する方法ですが、
やはりCanvasにキーを押す/離すに相当するKeyDown, KeuUpイベントが存在しているらしいです。
ただし、CanvasのSilverlightオブジェクトを取得しなけりゃいけない。
さて、それをやれるのはどこかというと、一つの回答はこんな感じ。
Canvasに対してcreateObject関数を使ってSilverlightから扱えるようにするのですが、
扱えるようになった時にonLoadイベントに設定された関数が呼ばれます。
この中でやるのがいちばん素直らしい。
function onLoadFunction(sender) {
  sender.AddEventListener("KeyDown", keydownFunction);
  sender.AddEventListener("KeyUp", keyupFunction);
}
 
Silverlight.createObject(
  (中略)
  {
    onLoad: onLoadFunction
  }
);
senderは、イベントが起こったオブジェクトを指します。
今回は、読み込みが終わった、というイベントなのでそのもの=ちょうど登録が終わったCanvasが入っていると。
後からつけるならば、AddEventListenerという関数でこんな感じに指定できるらしいですね。
 
それで、このkeydownFunction. keyupFunction関数がどう呼び出されるかというと、
keydownFunction : function(sender,keyEventArgs){
  var e = {};
  e.keyCode = keyEventArgs.platformKeyCode;
  e.shiftKey = keyEventArgs.shift;
  e.ctrlKey = keyEventArgs.ctrl;
 
  onKeyDownFunction(e);
}
今回はsenderはいらないので、2つめの引数のkeyEventArgsばっかり見ています。
そのkeyEventArgsにキーの情報が入っていて、keyEventArgs.Keyってやつもあります。
でも、なぜplatformKeyCodeっていうものを見ているかというと、、
  keyEventArgs.Key         ・・・・Silverlightで決まっている値(どのブラウザでも共通)
  keyEventArgs.platformKeyCode ・・・・JavaScriptのonkeydownイベントとかの値と同じ(ブラウザによって異なる)
 
確かにいつでも同じなのはいいのですが、今回はもともとクロスブラウザで作成済みなワケで、
既存のコードと親和性が高いplatformKeyCodeプロパティを使うのが良いというわけですね。
なお、onKeyDownFunction()関数は既存のやつと考えていて、どうせここ通るのIEだけだし
shiftKey, ctrlKeyも設定してやることで、既存の関数を丸々流用できる、というわけ。
 
なお、Silverlightオブジェクトにフォーカスがある時、
documentに設定していたonkeydown, onkeyupのイベントは反応してくれませんでしたが
なぜかonkeypressのイベントだけはそんなこと関係なく動作していました。
、、まさかkeydown/keyupの名前がかぶっていたから動作しなかった、、とか言いませんよね、、
 
しかしもともとVMLのほうでやる必要があったとはいえ、
uupaa-excanvas.jsの中のonLoad()関数をぱずぷれv3専用に魔改造しなきゃいけないのが玉に瑕。
そこでなんとか外部から取得する関数がないか、と調べようと思ったのですが
なぜかWeb上のmsdnライブラリが"コンテンツが存在しません"とか
言われてしまったので調査できず。今後の課題だなぁ。
posted by はっぱ at 23:54| Comment(539) | TrackBack(0) | プログラム