<![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键盘组合键