【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); } }