如何检测键盘上特殊键的向下/向上事件

时间:2015-08-28 11:58:37

标签: c# c++ windows-runtime windows-store-apps keyboard-events

我的环境是Windows 10 64位上的Visual Studio 2013。

在我的Windows应用商店应用程序(适用于Windows 8.1)中,我添加了这样的键盘事件(这是一个c ++ / cx程序,因为我使用的是C ++工具包):

auto amv = Windows::ApplicationModel::Core::CoreApplication::MainView;
if (amv){
    auto cw = amv->CoreWindow;
    if (cw){
        cw->KeyDown += ref new TypedEventHandler<CoreWindow ^, KeyEventArgs^>(srt, &WinRTApp::OnKeyDown);
        cw->KeyUp += ref new TypedEventHandler<CoreWindow^, KeyEventArgs^>(srt, &WinRTApp::OnKeyUp);
    }
}

当我在日语(109)键盘上按下Hankaku键时。系统使用未定义的VirtualKey代码(243)触发KeyUp事件,使用代码244触发KeyDown事件。当我释放该密钥时,不会触发任何事件。

第二次按下触发KeyUp(244)和KeyDown(243),第二次按下没有触发器。

我想完全检测KeyUp事件。有什么好方法吗?

1 个答案:

答案 0 :(得分:-1)

我已经调查了你的问题,并且发现了一种非常简单的方法来处理每次关键事件,无论字符值如何。在Onlaunched事件中,您可以在App.xaml.cpp中添加事件处理程序,也可以将其添加到特定页面,例如。 MainPage.xaml.cpp

 if(user.getPicture()!=null){
        imageId = (int) new Date().getTime();
        BinaryStreamImpl bs = new BinaryStreamImpl(user.getPicture());  
//picture is byte[] property in user class      
        this.image =   new DefaultStreamedContent(bs.getInputStream(), "image/png");
    }

在事件处理程序本身中只需使用

Windows::ApplicationModel::Core::CoreApplication::MainView->CoreWindow->KeyUp += ref new Windows::Foundation::TypedEventHandler<Windows::UI::Core::CoreWindow ^, Windows::UI::Core::KeyEventArgs ^>(this, &KeyUpTest::App::OnKeyUp);

每次发生非系统密钥时都会触发。对于具有bool数组的多个键状态,可以使用相同的过程。

可在此处找到更多信息:http://www.cplusplus.com/forum/windows/117293/

KeyUp和KeyDown命令存在许多问题,它们返回按下的键的值,但不返回所选字符的值,例如:

如果我按7,则响应为55,如果我按下shift 7,答案仍为55,而不是&amp;的值。您可能正在寻找的是CharacterReceived事件,它提供更多上下文并处理套管和其他值。

要添加此活动,您可以使用

void KeyUpTest::App::OnKeyUp(Windows::UI::Core::CoreWindow ^sender,       Windows::UI::Core::KeyEventArgs ^args)
{

}

处理程序看起来像:

Windows::ApplicationModel::Core::CoreApplication::MainView->CoreWindow->CharacterReceived += ref new Windows::Foundation::TypedEventHandler<Windows::UI::Core::CoreWindow ^, Windows::UI::Core::CharacterReceivedEventArgs ^>(this, &KeyUpTest::App::OnCharacterReceived);

我希望这很有帮助。