他ウィンドウのボタンなどからキャプションを抜き出すには?

解決


ユウキ  2004-03-29 22:33:23  No: 8017

こんにちは、
タイトルのとおりなんですが、
他ウィンドウのボタンなどからキャプションを抜き出すには
どうしたらいいでしょう?
WM_GETTEXTLENGTHや、WM_GetTextなどをSendMessageで使うらしいのですが、
Delphiでこれっ!というわかりやすいサンプルがなかったので、、
メモ帳のEditから抜き出す分でお願いします。


jok  2004-03-29 23:10:20  No: 8018

Win98 では以下のようにしてうまくいきました。

function GetClassName(Handle:HWND):string;
var
  p:PChar;
  L:integer;
begin
  result := 'Error';
  GetMem(p,100);
  L := Windows.GetClassName(Handle,p,100);
  if L>0 then SetString(result,p,L);
  FreeMem(p);
end;

function GetWinText(Handle:HWND):string;
var
  p:PChar;
  L:integer;
begin
  result := 'Error';
  L := SendMessage(Handle,WM_GETTEXTLENGTH,0,0);
  GetMem(p,L+1);
  L := SendMessage(Handle,WM_GETTEXT,WParam(L+1),LParam(p));
  if L>0 then SetString(result,p,L);
  FreeMem(p);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  hMemo,hEdit:HWND;
begin
  hMemo := FindWindow('Notepad',nil);
  hEdit := GetWindow(hMemo,GW_CHILD);
  if (hEdit=0) then exit;
  while UpperCase(GetClassName(hEdit)) <> 'EDIT' do
    hEdit := GetWindow(hEdit,GW_HWNDNEXT);

  Memo1.Lines.Text := GetWinText(hEdit);
end;


ユウキ  2004-03-29 23:30:43  No: 8019

jokさんサンプルコードありがとうございました。
こちらのXPでもコードの動作を確認でき、問題は解決しました。
本当にありがとうございました。


ユウキ  2004-03-29 23:39:41  No: 8020

jokさん、みていたらお返事がほしいのですが、、、

TfrmPetStatusWindowというウィンドウの中の、
TURLRichEditというコンポーネントから吸い取る場合は
どうしたらいいでしょう?


ユウキ  2004-03-29 23:50:28  No: 8021

procedure TForm1.Button1Click(Sender: TObject);
var
  hMemo,hEdit:HWND;
begin
  hMemo := FindWindow('TfrmPetStatusWindow',nil);
  HMemo := FindWindowEX(hMemo,0,'TColorPanel',nil);
  hEdit := GetWindow(hMemo,GW_CHILD);
  if (hEdit=0) then exit;
  while UpperCase(GetClassName(hEdit)) <> 'TURLRICHEDIT' do
    hEdit := GetWindow(hEdit,GW_HWNDNEXT);

  Memo1.Lines.Text := GetWinText(hEdit);
end;

とすることで解決できました。
解決後のレスを書いてすみませんでした。。


jok  2004-03-30 00:00:54  No: 8022

> TURLRichEditというコンポーネントから吸い取る場合は

メモ帳のエディット部分は  Windows のエディットコントロールですから
WM_GETTEXT メッセージに応答して書き込んでくれます。それ以外のコントロール
では、このメッセージに応答するかどうか、一般には分かりません。ですから
一般的な方法はありません。

TURLRichEdit

というクラス名からは、TRichEdit の派生クラスのように思われます。もしそう
なら同じようにしてテキストを取得できます。ただし、ハンドルの取得方法は
アプリリケーションのウィンドウの構造に依存しますので、具体的に見ないと
分かりません。ここでは、Win98 のワードパットのエディット部分が
'RichEdit20A' というクラスなので、以下のようにして取得できました。

procedure TForm1.Button1Click(Sender: TObject);
var
  hMemo,hEdit:HWND;
begin
  hMemo := FindWindow('WordPadClass',nil);  // アプリのメインウィンドウのクラス名
  hEdit := GetWindow(hMemo,GW_CHILD);
  if (hEdit=0) then exit;
  while UpperCase(GetClassName(hEdit)) <> 'RICHEDIT20A' do  //  エディット部分のクラス名
    hEdit := GetWindow(hEdit,GW_HWNDNEXT);

  Memo1.Lines.Text := GetWinText(hEdit);
end;

他の関数は前と同じです。エディット部分のハンドルの取得方法は自分で考える
しかありません。


jok  2004-03-30 00:10:56  No: 8023

あらら、解決済みですか(笑

他人のコードを使うときは、そのコードの意味をよく考えてみると
応答が広がりますね。


ユウキ  2004-03-30 07:31:41  No: 8024

>あらら、解決済みですか(笑
jokさん、ごめんなさい。自己解決しました。。。
呼び出してすみませんでした。。
また何かあったらお願いしますね!


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

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






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