<![CDATA[
Flex中的鍵盤事件
要在Flex中響應鍵盤輸入,只需注冊keyDown事件即可。
<mx:Application
xmlns:mx="
http://www.adobe.com/2006/mxml
" layout="
absolute
" keyDown="OnKeyDown(event)"
>
<mx:Script>
private
function
OnKeyDown(event:KeyboardEvent):
void
{
_
Msg.text +=
"Ctrl:"
+ event.ctrlKey +
", Key:"
+ event.keyCode +
"/n"
;
}
…
捕捉單鍵盤輸入時keyDown事件能夠很好的工作,但是,要處理組合鍵時keyDown事件就有問題了,例如:Ctrl+C,Ctrl鍵能夠捕捉到,但C就失效了。
折中的辦法,處理組合鍵時用keyUp事件。
<mx:Application
xmlns:mx="
http://www.adobe.com/2006/mxml
" layout="
absolute
" keyUp="OnKeyUp(event)"
>
<mx:Script>
private
function
OnKeyUp(event:KeyboardEvent):
void
{
_Msg.text +=
"Ctrl:"
+ event.ctrlKey +
", Key:"
+ event.keyCode +
"/n"
;
}
…
使用keyUp事件,雖然能夠響應了組合鍵,但還是存在問題,按鍵不靈活,而且要Up時才觸發事件,達不到一般軟件的組合鍵效果,手感差。所以,需要從外部應用程序截獲keyDown事件,再傳給Flex。
真·組合鍵
Flex端
定義并注冊OnExternalKeyDown方法,讓外部應用程序調用,參數按實際情況進行設計。
<mx:Application
xmlns:mx="
http://www.adobe.com/2006/mxml
" layout="
absolute
" creationComplete="Init()"
>
<mx:Script>
private
function
Init():
void
{
//
注冊外部方法
flash.external.ExternalInterface.addCallback(
"OnExternalKeyDown"
, OnExternalKeyDown)
}
private
function
OnExternalKeyDown(keyCode:uint, alt:Boolean, shift:Boolean, ctrl:Boolean):
void
{
_Msg.text +=
"Ctrl:"
+ ctrl +
", Key:"
+ keyCode +
"/n"
;
}
…
EXE端
為ShockwaveFlashObject控件注冊PreviewKeyDown事件,并添加實現方法。
axShockwaveFlash1.PreviewKeyDown +=
new
PreviewKeyDownEventHandler
(axShockwaveFlash1_PreviewKeyDown);
…
void
axShockwaveFlash1_PreviewKeyDown(
object
sender,
PreviewKeyDownEventArgs
e)
{
//注意:參數的順序必須跟Flex所定義方法的參數順序一致
StringBuilder
sb =
new
StringBuilder
();
sb.Append(
"<invoke name=/"OnExternalKeyDown/" returntype=/"xml/">"
);
sb.Append(
"<arguments>"
);
sb.Append(
"<number>"
).Append(e.KeyValue).Append(
"</number>"
);
sb.Append(
"<"
).Append(e.Alt.ToString().ToLower()).Append(
"/>"
);
sb.Append(
"<"
).Append(e.Shift.ToString().ToLower()).Append(
"/>"
);
sb.Append(
"<"
).Append(e.Control.ToString().ToLower()).Append(
"/>"
);
sb.Append(
"</arguments>"
);
sb.Append(
"</invoke>"
);
axShockwaveFlash1.CallFunction(sb.ToString());
}
運行EXE,按組合鍵,效果跟一般軟件的組合鍵效果一樣,手感回來了。
總結
Flex的鍵盤事件問題應該是flash player的Bug,Flex SDK官方上的大牛說目前無法解決,期待以后的版本吧。
這問題是細節問題,做事就要注重細節,時刻注重用戶體現,追求用戶體現才能開發出讓用戶滿意的軟件。
世界是平的,如果不平,就由自己來鏟平。
.net在windows上的優勢,不是AIR能夠比擬的,相對的,flex/flash在呈現渲染上的技術沉淀也不是.net所比擬的,充分結合兩種技術優勢能夠做出更完美的RIA軟件。
系列索引
Flex通信篇——Flex和外部應用程序進行通信
Flex通信篇——Flex和外部進行異步通信
Flex通信篇——Flex鍵盤組合鍵
Flex通信篇——構建企業級HTTP通信層
]]>
Flex通信篇——Flex鍵盤組合鍵