常に非アクティブなウインドウを作る方法

http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200301/03010148.txt
http://athomejp.com/goldfish/vcs/titlelessform.asp
最初に言うが、これは絶対にアクティブにならないウインドウを作る方法ではない。
(タスクバーでこのウインドウを選択した場合などはアクティブになる)
正確には、『ウインドウ上で何か操作をしても、アクティブ化されないウインドウ』を作る方法。例えば、このウインドウのボタンを押しても、このウインドウはアクティブにならずに、元々アクティブだったウインドウがそのままアクティブでありつづける、という動きをする。サンプルコードはc#だけれども、内容はwinapiなので言語は問わずに実装できると思う。


// ロードイベントでアクティブ化されない設定をする
private void Form_Load(object sender, EventArgs e)
{
this.setNotActiveWindow(this.Handle);
}

// アクティブ化されないスタイル設定
private void setNotActiveWindow(IntPtr hWnd)
{
// 現在のスタイルを取得
UInt32 unSyle = GetWindowLong(hWnd, GWL.EXSTYLE);

// キャプションのスタイルを削除
unSyle = (unSyle | WS_EX_NOACTIVATE);

// スタイルを反映
UInt32 unret = SetWindowLong(hWnd, GWL.EXSTYLE, unSyle);

// ウィンドウを再描画
SetWindowPos(hWnd, IntPtr.Zero,
0, 0, 0, 0,
SWP.NOMOVE | SWP.NOSIZE |
SWP.NOZORDER | SWP.FRAMECHANGED);
}

#region Win32API
const UInt32 WS_EX_NOACTIVATE = 0x8000000; // アクティブ化されないスタイル
private enum GWL : int
{
WINDPROC = -4,
HINSTANCE = -6,
HWNDPARENT = -8,
STYLE = -16,
EXSTYLE = -20,
USERDATA = -21,
ID = -12
}
private enum SWP : int
{
NOSIZE = 0x0001,
NOMOVE = 0x0002,
NOZORDER = 0x0004,
NOREDRAW = 0x0008,
NOACTIVATE = 0x0010,
FRAMECHANGED = 0x0020,
SHOWWINDOW = 0x0040,
HIDEWINDOW = 0x0080,
NOCOPYBITS = 0x0100,
NOOWNERZORDER = 0x0200,
NOSENDCHANGING = 0x400
}
[DllImport("user32.dll")]
private static extern UInt32 GetWindowLong(IntPtr hWnd,
GWL index);
[DllImport("user32.dll")]
private static extern UInt32 SetWindowLong(IntPtr hWnd,
GWL index, UInt32 unValue);
[DllImport("user32.dll")]
private static extern UInt32 SetWindowPos(IntPtr hWnd,
IntPtr hWndInsertAfter,
int x, int y, int width, int height, SWP flags);
#endregion


ちなみにこれらが最初に見つかったけど、結局出来なかったんで上記の方法を取った。
ズバリの答えは無かったので、いろいろ試行錯誤しながら作ったよ……。
http://okwave.jp/qa1532983.html
http://gimite.net/bcbqtree/qtreemain.cgi?mode=thread&thread=1063