駆け出し社会人の備忘録

駆け出し社会人がど忘れ防止用に日記をつけます

【C#】アクティブにならないウィンドウを作る

ソフトウェアキーボードとかペイントソフトで
使うと思うアクティブウィンドウ設定

 

  //アクティブウィンドウにしないための処置
    private const int WM_MOUSEACTIVATE = 0x21;
    private const int MA_NOACTIVATE = 3;
    private const int WS_EX_TOPMOST = 0x00000008;

    /// <summary>
    /// フォーム上のオブジェクトがクリックされたとき
  /// アクティブにならないようにする
    /// </summary>
    /// <param name="m"></param>
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_MOUSEACTIVATE)
        {
            m.Result = new IntPtr(MA_NOACTIVATE);
            return;
        }
            base.WndProc(ref m);
    }

    /// <summary>
    /// 表示される時にアクティブにならないようにする
    /// </summary>
    protected override bool ShowWithoutActivation
    {
        get
        {
            return true;
        }
    }

    /// <summary>     
    /// 常に最前面に表示させる(topMostプロパティを使うと
    /// ShowWithoutActivationが効かないため
    /// </summary>
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams p = base.CreateParams;
            p.ExStyle |= WS_EX_TOPMOST;
            return p;
        }
    }

 
このままではフォームはアクティブにならないが

配置されたコントロールはアクティブになってしまい

結果、メインフォームからフォーカスが離れてしまうので一工夫する。

 

    class MyButton : Button
    {
        public MyButton()
        {
            base.SetStyle(ControlStyles.Selectable, false);
        }
    }