1

小さなゲームをコーディングしているときに、問題が発生しました。私のフォームKeyDownKeyUpイベントはまったく起動しません。

フォームのコードは次のとおりです。

public class GameForm : Form
{
    private ControllableBlock player;

    public GameForm()
    {
        KeyDown += Game_KeyDown;
        KeyUp += Game_KeyUp;

        player = new ControllableBlock();
        Controls.Add(player);
    }

    private void Game_KeyDown(object sender, KeyEventArgs e)
    {
        player.ReactToKey(e.KeyCode);
    }

    private void Game_KeyUp(object sender, KeyEventArgs e)
    {
        player.ReactToKey(e.KeyCode);
    }
}

まだまだたくさんのことがありますが、私は関連するコードを貼り付けただけです。

私はすでに設定this.KeyPreview = true;と呼び出しを試しましたがthis.Focus();、どちらも機能しません。問題はReactToKey()メソッドにありません。すでにブレークポイントを設定していて、イベントが発生することはありません。


編集:いくつかのテストの後、問題は私の中にあるという結論に達しましたControllableBlock。それでも、理由はわかりませんが、現在取り組んでいます。に関連するすべてをコメントアウトするplayerと、イベントが発生し始めます。


編集2:問題は私がControllableBlockから継承していることのようControlです。から継承すればPanel問題なく動作します。 どうしてこれなの?コントロールから継承した場合、イベントを発生させることはできませんか? クラスは今のControllableBlockところ空なので、から継承する以外は何もしませんControl


編集3:報奨金を開始したので、イベントを発生させる方法についての解決策を探しているのではなく、イベントが発生しない理由を探していることを明確にしておきたいと思います。から継承しControlます。

4

4 に答える 4

4

イベントをアプリケーション全体で行う必要がある場合は、プロパティKeyPreviewをに設定してみてくださいtrue。これにより、集中制御に関係なく、それぞれのイベントを発生させることができます。

this.KeyPreview = true;

それ以外の場合は、これらのイベントを直接アタッチして、それらを処理するコントロールに接続する必要があります。

編集:

フォームから削除InitializeComponent();して、あなたと同じ動作をしました。

この質問で提供されたソリューションを実装した後、すべてのイベントが完全に実行され始めました。
ここにコードスニペットをコピーします:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
        if (keyData == Keys.Left) {
            // Do your staff for Left Key here

            return true;
        }
        // you need to add if condition to every direction you want to handle
        return base.ProcessCmdKey(ref msg, keyData);
    }
于 2013-02-26T14:17:06.997 に答える
0

ハンドラーのセットアップをコンストラクターではなくForm_Loadイベントに移動してみてください。Initialize()コンストラクターでへの呼び出しがあるべきではありませんか?特に削除することはお勧めしません

Panelから継承する場合ControllableBlockは、ベースのControlオブジェクトよりも多くのイベントフックアップと優れたUIインタラクション設定があります。

于 2013-02-26T14:16:52.157 に答える
0

フォーカスを受け取る前に、コントロールを選択可能にする必要があります。

コンストラクターに次を追加してみてください。

this.SetStyle(ControlStyles.Selectable, true);

また、フォームが表示された後にフォーカスを与えるようにしてください。または、OnMouseDown() をオーバーライドして this.Focus() を呼び出します。

于 2013-02-26T14:19:32.393 に答える