Nicotto Town


bz9の・・・なにか。


C# ALTを押した時のメニューを無効化


一つ上のブログのC#版のコードです。

以前ゲームを目標にプログラムを組んでいると書きました。

それに関することで若干自分用のメモですが
わかったことを書きます。


画像をループで描画させることはできているんですが、
ALTキーを押してしまうと 描画やループが止まってしまいます。

これはどのアプリケーションでも同じなんですが
ALTキーを押すとウィンドウ上部のメニューにフォーカスが移ります。
また、メニューのないウィンドウでもタイトルバーを右クリックした時にでる
メニュー辺りにフォーカスが移ってしまうようで、
こうなった時に描画やループなど、そのスレッドの処理が止まってしまうようです。


・・・つまり何が言いたいかといいますと、

ゲームで遊んでいる人が偶然ALTキーを押してしまった時に
処理が止まってしまうということです。

キーが押された時の処理は
キーボードが押された時に発生するイベントでいいのですが
ALTキーが押された時の、この現象は
そのイベントの処理が終わったあとに起きてしまうので
そのイベントではこの現象を防ぐことができません・・・


なので別の方法で対処することにしました。

まず、Windowsでは
ボタンとかメニューとかテキストボックスとか
コントロールと呼ばれるものがいろいろありますが、
これらのクリックされた時に何かする とか、
キーが押された時に何かする とか、

そういう動作がありますよね。

これらはウィンドウメッセージというものが関係しています。
(ウィンドウメッセージではありませんので注意)

詳しくはGoogleとかで検索してください。
http://www.google.co.jp/search?hl=ja&source=hp&q=%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8&btnG=Google+%E6%A4%9C%E7%B4%A2

Microsoftの解説
http://msdn.microsoft.com/ja-jp/library/ff381405%28v=vs.85%29.aspx

・・・で、
おそらくこのウィンドウメッセージに
メニューにフォーカスを移すときのイベントも飛んできているんだろうなと
予想したbz9。

その予想は当たっていたようです。

WM_SYSCOMMAND (0x112) メッセージが飛んできていました。

( "0x" ってなんだよ! って人に

0xは16進数を表しているものです。)

実験1
そのメッセージが来た時に本来の処理に通さず、
無視させてみました。

結果1
ALTキーの無効化には成功!

・・・したけど、

ウィンドウの移動や、ウィンドウを閉じることが
できなくなってしまったため まだ失敗・・・

実験2
そのメッセージのWParamに 0xf100 の値が入っていたので
その時だけ無視させてみました。

結果2
ALTキーの無効化に成功!

・・・

ウィンドウの移動や、ウィンドウを閉じることが
できた!!

(WParamとは

Microsoftのサイトの説明に、
> メッセージによってはデータを伴うものもあります。

と書いてあります。

このWParamというのがまさにそれで、
メッセージと一緒に飛んできたデータのことです。

ちなみにLParamというのもあり、
これもメッセージと一緒に飛んできたデータです。)

うまくできたコード
Form1などのFormに次のコードを追加してください。

        private const int WM_SYSCOMMAND = 0x112;

        protected override void
WndProc(ref System.Windows.Forms.Message m)
        {
            switch (m.Msg)
            {
                case WM_SYSCOMMAND:
                    if (m.WParam.ToInt32() == 0xf100)
                    {
                        return;
                    }
                    break;
            }
            base.WndProc(ref m);
        }

WndProc というのが ウィンドウメッセージを処理するメソッドです。
引数 m にウィンドウメッセージが入っています。
そこから Msg プロパティの値が WM_SYSCOMMAND かどうかを調べ、
さらに WParamが 0xf100 かどうかを調べて
そうだったら return で、メソッドを終わらせています。

こうすることでALTキーを無効化できますが、
KeyDownイベントではちゃんと拾えるので
他で使う場合も大丈夫です。


ついでに
ALTキーは Alternate キーの略だそうです。




Copyright © 2025 SMILE-LAB Co., Ltd. All Rights Reserved.