2016年8月3日水曜日

C#のフォームをアクティブにさせない

基本的にOSのGUIというものはどこかをクリックすればそのウインドウ(あるいはデスクトップ)がアクティブとなり、以降のキー入力等はそのアクティブなプログラムに渡されることになる。
が、これでは都合がわるい時がある。プログラミングで何かを作っている時に一番有り得そうなのは「とりあえずスクリーンキーボードみたいなの作ってみるか~」って時だと思う。スクリーンキーボード自体がアクティブになってしまっては入力したキーがすべて自分に帰ってきてしまう。
そういう時はC#のFormをアクティブにしないような工夫が必要となる。

private const int WS_EX_NOACTIVATE = 0x8000000;
protected override CreateParams CreateParams
{
    get
    {
        CreateParams p = base.CreateParams;

        if (!DesignMode)
        {
            p.ExStyle |= (WS_EX_NOACTIVATE);
        }

        return (p);
    }
}

とりあえずは上のコードをFormの適当な場所に貼り付けておけばよろしい。

このようにした場合、Formをクリックしてもアクティブなウインドウは変化しなくなる。
ただしタイトルバーのクリック等はそのまま有効になるから、タイトルバーをドラッグして移動とかは可能。タスクバーのアイコンをクリックした場合はFormはアクティブになるから、その場合はキー入力がこのFormに渡されることになる。

いくつか欠点があるとすれば、FormのTextBox等の入力が不可能、Formを移動した場合に別のウインドウの裏に潜り込む場合がる、等。後者についてはタスクバーで一旦このプログラムをアクティブにしてやるか、プログラムを常に手前に表示するようにする必要がある。現実的には常に手前に表示が楽だと思う。


FSXは非アクティブになってもシミュレーションを続行することは可能だが、音が出なくなってしまうため、SimConnectとかでボタン操作とかを渡すプログラムはこういう工夫が必要になる。
FSXでフラップとかギアの操作にキーボードを使うのもなんかマヌケな感じがするので、Formにボタンとか配置してAPのモード切り替えできたら楽しいかなとか思ってる。もっとも、僕のPCは非タッチ液晶がプライマリとして正面にあり、タッチ液晶のセカンダリが右側にあるので、右手でスティックを持っているとタッチ液晶に手が届かない。「機長席に座ってる気分で左手でスティックを操作すればいいだろ」と言われれば全くそのとおりなのだけど、右利きの人間としては左手で飛行機を操縦するのは正気の沙汰とは思えない。とはいってもボーイングもエアバスも関係なく機長は左手で操作するわけだから、慣れとかなんだろうが。

0 件のコメント:

コメントを投稿