1

C++ で何らかのフォーム アプリケーションを使用している場合、特定のキー シーケンスを監視して何らかのアクションを実行するように設定するにはどうすればよいでしょうか? たとえば、ユーザーが特定の順序で矢印キーをタップするのを監視し、それが発生したときに別のフォームを開くようにしますか?

(明らかにこれは .net ですか? 私はフォームを作成するのが初めてなので、ここで少し迷っています。)

4

1 に答える 1

0

メインにフォーカスがあることを要求しても問題ない限りForm、単純なバージョンでは、KeyPreviewプロパティを に設定しtrue、ハンドラーを追加しPreviewKeyDownます。

#using <System::Windows::Forms.dll>

// for brevity of example
using namespace System;
using namespace System::Windows::Forms;

public ref class Form1 : Form
{
private:
    // desired key sequence
    static array<Keys>^ contra = { Keys::Up, Keys::Up, Keys::Down, Keys::Down,
                                   Keys::Left, Keys::Right, Keys::Left, Keys::Right,
                                   Keys::B, Keys::A, Keys::LaunchApplication1};

    // how far into the sequence the user currently is
    int keySeqPos;

    // some other data
    int lives;

    void Form1_PreviewKeyDown(Object^ sender, PreviewKeyDownEventArgs^ e)
    {
        if{keySeqPos < 0 || keySeqPos >= contra->Length)
        {
            // reset position if it's invalid
            keySeqPos = 0;
        }

        // use the following test if you don't care about modifiers (CTRL, ALT, SHIFT)
        // otherwise you can test direct equality: e->KeyCode == contra[keySeqPos]
        // caps lock, num lock, and scroll lock are harder to deal with
        if(e->KeyCode & Keys.KeyCode == contra[keySeqPos])
        {
            keySeqPos++
        }
        else
        {
            keySeqPos = 0;
            // alternatively, you could keep a history and check to see if a
            // suffix of it matches a prefix of your code, setting keySeqPos to
            // the length of the match
        }

        if(keySeqPos == contra->Length)
        {
            // key sequence complete, do whatever it is you want to do
            lives += 3;
        }
    }

    void InitializeComponent()
    {
        // other initialization code

        this->KeyPreview = true;
        this->PreviewKeyDown += gcnew PreviewKeyDownEventHandler(this, &Form1::Form1_PreviewKeyDown);
    }

public:

    Form1()
    {
        InitializeComponent();

        keySeqPos = 0;
        lives = 3;
    }
}
于 2013-04-20T04:35:40.400 に答える