监听键盘事件


AIR 启动后,监听全局键盘事件,即this.addEventListener( KeyboardEvent.KEY_DOWN, keydownHandler );

运行后效果:
AIR 运行后,虽然正确监听了KeyboardEvent .KEY_DOWN event,但是必须要鼠标点击一下AIR 才可以获取keydownHandler。

原因:
1、keydownHandler的获取需要监听的对象获得焦点,当mouse click AIR 后,则相当于获取焦点。
2、只有当监听的对象获取焦点后,才能出接收到KeyboardEvent .KEY_DOWN event。

因此问题根结:
如何让监听对象自动获取焦点。

解决方案:(步骤)
1、
this.dispatchEvent ( new MouseEvent( MouseEvent.CLICK ));
通过以上的方式即可让程序“自动点击”dispatchEvent 的对象。

2、
获取焦点方式:
this.stage.focus  = this;

片段代码如下:
<s:WindowedApplication 
      xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" 
      xmlns:mx="library://ns.adobe.com/flex/halo"
      creationComplete="createCompleteHandler (event)">

private function createCompleteHandler( event : FlexEvent ) : void {
      //监听ouseEvent.CLICK event
      this.addEventListener( MouseEvent.CLICK, clickHandler );
      //监听KeyboardEvent.KEY_DOWN
      this.addEventListener( KeyboardEvent.KEY_DOWN, keyDownHandler );
}

private function clickHandler( event : MouseEvent ) : void {
      this.stage.focus  = this;
}

private function keyDownHandler( event : KeyboardEvent ) : void {
      //TO DO
}

自动触发mouse click的代码:(以下代码在this.addEventListener( KeyboardEvent .KEY_DOWN, keyDownHandler );的下面)
var timer : Timer = new Timer( 100, 1 );
timer.addEventListener( TimerEvent.TIMER_COMPLETE, function ( event : TimerEvent ) : void {
      event.target.stop();
      dispatchEvent ( new MouseEvent( MouseEvent.CLICK ));
});
timer.start();
之所以用timer来处理是因为当create complete后,直接使用dispatchEvent 会发现stage尚未赋值,因此需要延时一段时间处理。
注意:以上代码适用于AIR ,在Flex 里面按照如下写法仍旧无法获取KeyboardEvent .KEY_DOWN event。

Flex 里面是如何自动获取焦点、监听全局键盘事件的呢?

原因:
Flex 由于有浏览器的包裹,因此当打开浏览器后,由于SWF 尚未获取焦点,因此就算自动获取了焦点(dispatchEvent ( new MouseEvent( MouseEvent.CLICK ));)也是没有意义的。

解决方法:
在嵌入SWF 的html里面加入如下的功能:
<body οnlοad="document.getElementById('swf id').focus()">
这句话的含义: 当onload完毕后,自动设定SWF 为焦点状态。

最后再按照AIR 的写即可完成自动获取焦点、监听全局键盘事件。

在C++中,监听键盘事件通常需要依赖于特定的平台API或者是使用某些图形用户界面(GUI)库。不同的操作系统提供了不同的API来处理输入事件,比如Windows平台的Win32 API,而跨平台的图形库如Qt或wxWidgets也提供了事件监听的功能。 以下是在Windows平台使用Win32 API监听键盘事件的一个简单例子: ```cpp #include <windows.h> LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR args, int ncmdshow) { WNDCLASSW wc = {}; wc.hbrBackground = (HBRUSH)COLOR_WINDOW; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hInstance = hInst; wc.lpszClassName = L"myWindowClass"; wc.lpfnWndProc = WindowProcedure; if (!RegisterClassW(&wc)) { return -1; } CreateWindowW(L"myWindowClass", L"My Window", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 500, 500, NULL, NULL, NULL, NULL); MSG msg = {}; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_KEYDOWN: // 键盘按键按下事件 MessageBox(NULL, L"按键按下", L"键盘事件", MB_OK); break; case WM_KEYUP: // 键盘按键释放事件 MessageBox(NULL, L"按键释放", L"键盘事件", MB_OK); break; default: return DefWindowProcW(hWnd, msg, wp, lp); } return 0; } ``` 在上述代码中,我们定义了一个窗口类,创建了一个窗口,并设置了一个窗口过程函数`WindowProcedure`来处理窗口消息。通过这个函数,我们可以捕获到键盘事件,例如`WM_KEYDOWN`表示键盘按键被按下,`WM_KEYUP`表示键盘按键被释放。 对于使用图形库的情况,例如在Qt中,你可以通过重写`QWidget`的`keyPressEvent`和`keyReleaseEvent`函数来监听键盘事件。 ```cpp #include <QApplication> #include <QWidget> #include <QKeyEvent> class MyWidget : public QWidget { public: MyWidget(QWidget *parent = nullptr) : QWidget(parent) {} protected: void keyPressEvent(QKeyEvent *event) override { // 处理按键按下事件 qDebug() << "Key Pressed:" << event->key(); } void keyReleaseEvent(QKeyEvent *event) override { // 处理按键释放事件 qDebug() << "Key Released:" << event->key(); } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); MyWidget widget; widget.show(); return app.exec(); } ``` 在这个例子中,`MyWidget`类继承自`QWidget`,并且我们重写了`keyPressEvent`和`keyReleaseEvent`函数来处理按键事件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值