ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
フォーラム一覧   -   トピック一覧
   Flex 4 SDK
     forcusに関係なくKeyboardEventを発生させるには?
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 トピック
ganzy
投稿日時: 2010-6-19 15:13
一見さん
登録日: 2010-6-19
居住地:
投稿: 3
forcusに関係なくKeyboardEventを発生させるには?
やりたいことは、アプリケーションのどこにフォーカスがあっていたとしてもユーザが押したキーボードのキーコードを得たいのです。

私が考えた方法は、
ダミーのボタンを配置してそいつに常に(毎フレーム)強制的にフォーカスを当てることで解決しようとしました。
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="800" minHeight="600" xmlns:ns1="*"
frameRate="24"
creationComplete="init()">
<fx:Script>
<![CDATA[
import flash.events.*;

private function init():void {
_setup()
}
private function _setup():void {
//key event
this.addEventListener(KeyboardEvent.KEY_DOWN, key_down);

//enter frame event
this.addEventListener(Event.ENTER_FRAME, oef);
}
private function oef(e:Event):void{
focusManager.setFocus(dummyBtn);
}



oef()で毎回focusManager.setFocus(dummyBtn);を実行し、強制的にdummyBtnにフォーカスをあてることによって、
key_down()が実行できるようになります。

しかしこの方法では、他のコンポーネントのフォーカスを奪ってしまうので、他のコンポーネントが使い物になりません。

FlashCSシリーズでの開発のときは、stageというものがあったので、
stage.addEventListener(KeyboardEvent.KEY_DOWN, key_down)
とすることで、どんな時でもフォーカスに関係なくkey_down()を発生させることができました。
Flex4(Flash Builder 4)ではそういうことはできないのでしょうか?

知恵をお貸しください。よろしくおねがいします。

■環境
FlashBuilder4
ganzy
投稿日時: 2010-6-19 16:05
一見さん
登録日: 2010-6-19
居住地:
投稿: 3
Re: forcusに関係なくKeyboardEventを発生させるには?
自己解決しました。

実は、質問には書いてませんが、
creationComplete="init()"のinit()内で
stage.addEventListener(KeyboardEvent.KEY_DOWN, key_down);
を試してはいたのですが、これをすると、nullのエラーがでていたんです。

それで、いろいろ調べていると、
http://actionscript.g.hatena.ne.jp/d4-1977/20090205/1233788110
このようなページにたどり着きまして、どうも
creationCompleteの段階ではstageはまだ生まれてないらしく、

代わりに
applicationComplete
によって呼び出した関数内で
stage.addEventListener(KeyboardEvent.KEY_DOWN, key_down);
をすればうまくいきました。


例:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="800" minHeight="600" xmlns:ns1="*"
frameRate="24"
creationComplete="init()" applicationComplete="init2()">
<fx:Script>
<![CDATA[
import flash.events.*;

import mx.collections.ArrayList;

import spark.components.Group;


private function init():void {
_setup()
}
private function init2():void {
stage.addEventListener(KeyboardEvent.KEY_DOWN, key_down);
}
kacchan6
投稿日時: 2010-6-19 20:14
ご主人様
登録日: 2009-10-15
居住地:
投稿: 167
Re: forcusに関係なくKeyboardEventを発生させるには?
もう解決済みかもしれませんが、他にも応用が効くと思うので・・・。
StageはsystemManager経由であればいつでも取得できます。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を