Paradigm Shift Design

ISHITOYA Kentaro's blog.

クリックしてもアクティブにならないウィンドウを作る方法

研究室で,先生がWiiPointer関連でC#を使っているので,僕も使うことになりそう.


というわけでメモ.
背景用のウィンドウがクリックすると最前面に来てしまうので,クリックしてもアクティブにならないウィンドウを作る必要があった.
メインウィンドウをアクティブ化せずにメニューを開くには? − Insider.NET − @IT


Form.enableをfalseにすれば,そうなるのかなと思ったけれど,enableプロパティはForm内に含まれるコントロールが選択不可になるだけでクリックするとウィンドウがアクティブになる.


で,これをやるにはWIN32APIを使うらしい.WinProcをオーバーライドしてWM_MOUSEACTIVATEが飛んできたときにResultにNO_ACTIVATEをsetすればよい.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Test
{
    public partial class Form1 : Form
    {
        const int WM_MOUSEACTIVATE = 0x0021;
        const int WA_NOACTIVATE = 3;

        public Form1()
        {
            InitializeComponent();
        }
        
        protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case WM_MOUSEACTIVATE:
                    m.Result = (IntPtr)WA_NOACTIVATE;
                    return;
            }
            Console.WriteLine(m.Msg);
            base.WndProc(ref m);
        }
    }
}

これでアクティブにならないウィンドウができる.


しかし・・・C#になったのに,全然Wrapされてないのね.
せめてマウスイベントくらいMouseEvent.MOUSE_DOWNとかクラス定数にしてくれないのかな.微妙.


つか,6年ぶりくらいでWindowsプログラミング?した.