現在表示されている子ウインドウを列挙するには?

解決


DBOX  2003-08-28 08:11:51  No: 4486

ここの[過去のTips集]-[DelphiによるWin32API]
-[現在表示されているウインドウを列挙する]を
試してみたのですが次の場所でエラーが出てしまいます。
>    EnumWindows(@EnumWindowProc, 0);
>[エラー] test.pas(49): 変数が必要です

環境はWIN2KSP2+Delphi7proです。
よろしくお願いします。


Halbow  URL  2003-08-28 08:38:09  No: 4487

Halbow です。

[現在表示されている子ウインドウを列挙する]

じゃなくて、

[現在表示されているウインドウを列挙する]

じゃないですか? 

function EnumWindowProc(Handle: hWnd; lPalam:        Integer):Boolean;Stdcall;
var
  Title: array[0..255] of char;
begin
  //タイトルがあって表示されているウインドウをメモに書き込む
  If (GetWindowText(Handle, Title,255 ) <> 0) And
       IsWindowVisible(Handle) then
    Form1.Memo1.Lines.Add(Title);

  Result := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Clear ;
  EnumWindows(@EnumWindowProc, 0);
end;

コピペして実行してみましたが問題なくうまくいっています。


DBOX  2003-08-28 23:23:43  No: 4488

>[現在表示されているウインドウを列挙する]
>
>じゃないですか? 
その通りです。失礼しました。

そして基本的なミスでした。
>function TForm1.EnumWindowProc(Handle: hWnd; lPalam:Integer):Boolean;Stdcall;
自分は関数や手続きの中で使用される以外は
private、public部で全て定義すると勝手に思い込んで
いたので機械的にこれを補完していました。
しかしよく見るとEnumWindowProcはAPIですね。
Stdcallの意味もなんとなくでよく理解していなかった
ので迂闊でした。
>コピペして実行してみましたが
の部分でもしかするとと思い試してみたところ
やっと間違いにやっと気づくことができました。
ありがとうございました。


Halbow  2003-08-28 23:36:23  No: 4489

Halbow です。

>自分は関数や手続きの中で使用される以外は
>private、public部で全て定義すると勝手に思い込んで
>いたので機械的にこれを補完していました。

EnumWindowProc() は  EnumWindows() API を実行したときに
システムから呼ばれるコールバック関数ですよね。ですから、
Delphi のクラスのメソッドにすることはできません。
けっこう重要なことですので覚えておいてください。


DBOX  2003-08-29 07:55:47  No: 4490

即答ありがとうございます。
コールバック関数、相手から呼び出してもらう関数のことですね。
Tipsばかり試して基本ができていないので少し恥ずかしいです。
基本からやり直してきます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加