API EnumWindows関数の引数が解からないです

解決


星一鉄  2002-08-28 02:53:53  No: 1374

ウインドウハンドル内のメッセージを得るプログラグに挑戦中です。
サンプルプログラムやヘルプなんかも何回も見ましたが、今ひとつピン
とこない部分があって、御教授願おうと思い、カキコさせてもらいました。
----------------MSDNヘルプ----------------------
EnumWindoes(wndenmprc,lParam)
   wndenmprc /* コールバック関数のアドレス */
   lParam    /*アプリケーション定義の値    */

BOOL CALLBACK EnumWindowProc(hwnd,lParam)
   hwnd      /* 親ウインドウのハンドル    */
   lParam    /* アプリケーション定義の値  */
------------------------------------------------
EnumWindoesにコールバック関数のアドレス を渡すとコールバック関数に
親ウインドウのハンドルが渡される、という事はわかりますが、
「アプリケーション定義の値 」というのが解かりません。
コールバック関数は内容を自由にプログラムできるのだから、その自由に
プログラムした中で定義すべきものなのかなぁ。と、漠然と思うのですが、
ただどうもピンと来ません。
ヘルプで同じ「lParam」と書かれている事も気になります。
漠然とした質問で申し訳ありませんが、よろしくお願い致します。
ちなみに本格的なAPIは初挑戦です。
ヒントだけでもいただければ、、と思います。


kazu  2002-08-28 03:19:07  No: 1375

あまり詳しくはないのですが、
EnumWindows(@EnumWindowProc, 0);
のように使用します。
なお、第二引数に関しては0でなければならないそうです。

#余談ですが、さらに詳しい情報がほしい場合は、Googleなどで
#「EnumWindows Delphi」などのキーワードで検索すると詳しく
#解説されているサイトにたどり着きます。


星一鉄  2002-08-28 04:51:51  No: 1376

情報ありがとうございます。
さっそくWeb上で検索してみます。


にしの  2002-08-28 07:00:24  No: 1377

第2引数が0でなければならないというのは何処で見つけました?
0でなくてはならないのであれば、コールバック関数に値を渡したいときに、わざわざグローバルな変数を用意しなければなりませんよね。


にしの  2002-08-28 07:25:54  No: 1378

lParamは、コールバック関数に値を引き渡すのに便利です。
0とは限りません。

例えば、フォームに貼り付けたTMemoのオブジェクト(Memo1)に、ウィンドウのキャプションを列挙するには、次のようになります。

type
  PMemo=^TMemo;

function EnumWinProc(hwnd,lParam: LPARAM): BOOL; stdcall;
var
  buf: array[0..512] of char;
begin
  GetWindowText(hWnd, buf, 512);
  PMemo(lParam)^.Lines.Add(buf);

  Result := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  EnumWindows(@EnumWinProc, LParam(@Memo1));
end;


kazu  2002-08-28 07:35:33  No: 1379

にしの氏
>第2引数が0でなければならないというのは何処で見つけました?

ttp://homepage1.nifty.com/MADIA/vb/API/EnumWindows.htm
ここに書いてあることを額面どおりに受け取ってしまったようです。

星一鉄様、誤った情報を流してしまい申し訳ありませんでした。


星一鉄  2002-08-28 16:20:21  No: 1380

kazu様
>星一鉄様、誤った情報を流してしまい申し訳ありませんでした。
とんでもございません。API初挑戦の僕には雲を掴むようなものでした
ので、よいヒントとなりました。

にしの様
すいません。もう少し教えてください。
----------------------------------------------------------
EnumWindows(@EnumWinProc, LParam(@Memo1));
                            ↑{Memo1のアドレス}
function EnumWinProc(hwnd,lParam: LPARAM): BOOL; stdcall;
                            ↑{Memo1のアドレス}
-----------------------------------------------------------
EnumWindows第2パラメータからコールバック関数第2パラメータに
Memo1のアドレスが渡されている。
それを渡す為にlParamフィールド(MSDNに書いてた)を使用している。
という解釈でよいでしょうか?。
lParamというのはいろんな情報を格納できるのでLPARAM型にして
使っている。
はずしてます?。


にしの  2002-08-28 18:27:36  No: 1381

最初のほうはあっています。
EnumWindows APIを呼び出すと、その引数lParamが、コールバック関数EnumWindowProcに渡されます。

lParamの格納できるデータは数値のみです。ポインタも数値なので、渡すことができます。
たとえば文字列を渡すときは、文字列へのポインタを渡さないと駄目です。
今回は、Memo1オブジェクトへのポインタを渡すことで、コールバック関数内でMemo1を操作しました。


星一鉄  2002-08-28 18:48:07  No: 1382

ありがとうございました。
だいぶ解かってきました。
でも、APIとなるとC言語の領域に入る面があって、僕にはちと難しいです。
御教授頂いた事を復習し、ひとつひとつ理解していきたいと思います。
頑張って勉強しますが、また、解からない時は助けてください。


星一鉄  2002-08-28 19:18:45  No: 1383

解決マークをチェックし忘れてました。(^^;


にしの  2002-08-28 19:35:00  No: 1384

一応追加情報です。

http://madia.world.coocan.jp/vb/API/EnumWindows.htm
> ここに書いてあることを額面どおりに受け取ってしまったようです。
これはVBですよね。
VBはポインタ関連に弱いですから、lParamで渡すよりグローバルで持った方が簡単になります。


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








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