■ Tips [Delphi] 1-1
 Delphi - Delphiでちょっと使える子ネタ集
 第1回 「各種ウィンドウ操作について 」

 さて、初回の話題としては開発途中でとん挫している「何でもさくら」及び「NetSender」の開発において用いたウィンドウ操作系の関数の話題です。この何でもさくらは、あの任意たん事件がらみで開発をしようと思った常駐型のウィンドウ及びコントロール監視ソフトであり、その発想から「NetSender」の受信部も作られました。ほとんどがWin32APIであり、既知の分野ではありますが、簡単な話題からということで書いてみました。

 1-1 ウィンドウのアクティブ化

 一番よく使うウィンドウの操作はアクティブ化だと思います。つまり、隠れてしまっている特定のウィンドウを最前面に表示させるわけです。自分で作成した単一フォームに対してこの動作を行うのはとても簡単です。例えば


TMyForm = class(TForm);
var
 MyForm1:TMyForm;


MyForm1.Show


こんな感じです。しかし、当然ほかのアプリケーションのフォームに対してこの手法は使えません。そうなるとWindowsのAPI関数を使うことになります。
 さて、Win32APIで簡単にこのことを実現できる関数は「Win32 Programmers Reference」から

BOOL SetForegroundWindow(
 HWND hWnd // handle of window to bring to foreground
);


とあります。つまり、アクティブ化したいウィンドウのハンドルが分かっていればそれを引数としてこの関数を呼び出しましょう。ちなみに返り値は成功時には非零、失敗すると零が返ります。
つまり、上の例であれば、

var
 Ret:Integer;


Ret := SetForeGroundWindow(MyForm1.Handle);


という感じで良いわけです。さて、この例は自前のフォームに対して行っていますが、ほかのウィンドウでも同じようにハンドルを渡せばいいのです。
 そのハンドルはどうやって取得するか?それは次からのお楽しみです。

補足 (2002/02/01)

 Delphiのフォームを常に最前面に表示させておく方法(アクティブ化とは違う)はとても簡単です。FormのFormStyleプロパティをfsStayOnTopに設定するだけです。


Form1.FormStyle := fsStayOnTop;


これは設計時でも実行時でも可能です。もしWin32APIを使うのであれば


BOOL SetWindowPos(
 HWND hWnd, // handle of window
 HWND hWndInsertAfter, // placement-order handle
 int X, // horizontal position
 int Y, // vertical position
 int cx, // width
 int cy, // height
 UINT uFlags // window-positioning flags
);


 この関数に最前面に移動するフォームのハンドルと共に最前面要求を送ります.X,Y,cx,cyを使えばフォームの位置・大きさを変更できますが今回はフォームの大きさを変更したくないのでwindow-positioning flagsに対して移動せずリサイズしない為の要求を出しておきます.

SetWindowPos(Form1.Handle,HWND_TOPMOST,1,1,1,1,SWP_NOMOVE+SWP_NOSIZE);


 ここではX,Y,cx,cyに適当に数値を入れていますが全て無効になります.

 NEXT