最前面表示に必要なAPIはSetWindowPos。
毎度おなじみShellAPIユニットに記述されている。
function SetWindowPos(hWnd: HWND; hWndInsertAfter: HWND; X,Y,cx,cy: Integer; uFlags: Cardinal): Boolean;
引数がやたら多くてめんどくさそうだが、
よく見れば分かりやすいAPIなのでご安心を。
まず第1引数で対象となるウインドウハンドルを指定する。
Form1ならForm1.Handleとか指定すればOK。
第2引数では特定のウインドウハンドルを指定する。
これは特定のウインドウとのZオーダーを決めるためのハンドルだが、
以下の定数等を用いることで最前面表示が可能になる。
−定数−
・HWND_BOTTOM:最背面に配置
・HWND_TOPMOST:常に最前面に配置
・HWND_TOP:最前面に配置
・HWND_NOTOPMOST:常に最前面に配置を解除
第3〜第6引数はウインドウの左上の座標と幅、高さを指定する。
最後の引数は動作フラグを指定する。
フラグは以下の通り。
−フラグ−
・SWP_DRAWFRAME:ウインドウを囲む枠を描写
・SWP_FRAMECHANGED:サイズ変更がされなくてもWM_NCCALCSIZEメッセージを送る。
・SWP_HIDEWINDOW:ウインドウを非表示にする
・SWP_NOACTIVATE:ウィンドウをアクティブにしない
・SWP_NOCOPYBITS:クライアント領域内の再描写イメージをコピーしない
・SWP_NOMOVE:ウィンドウを移動しない(3、4番目の引数を無視)
・SWP_NOSIZE:ウィンドウのサイズを変更しない(5、6番目の引数を無視)
・SWP_NOREDRAW:処理後、あらゆる再描写を一切行わない
・SWP_NOZORDER:ウィンドウ配置順序を変更しない(2番目の引数を無視)
・SWP_SHOWWINDOW:ウィンドウを表示する
やたらとフラグがあるが、必要なものだけ選択しよう。
で、肝心の常に最前面に設定する方法はと言うと、
こんな感じでOK。
−設定時−
SetWindowPos(Self.Handle,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE or SWP_NOMOVE);
−解除時−
SetWindowPos(Self.Handle,HWND_NOTOPMOST,0,0,0,0,SWP_NOSIZE or SWP_NOMOVE);
第2引数で分かると思うが、これで常に最前面かどうかを設定する。
あとは面倒なのでサイズ変更と移動をフラグで無視している。
無論移動させたりサイズ変更するなら引数に適切な数値を指定しよう。