こんにちは、
タイトルのとおりなんですが、
他ウィンドウのボタンなどからキャプションを抜き出すには
どうしたらいいでしょう?
WM_GETTEXTLENGTHや、WM_GetTextなどをSendMessageで使うらしいのですが、
Delphiでこれっ!というわかりやすいサンプルがなかったので、、
メモ帳のEditから抜き出す分でお願いします。
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;
jokさんサンプルコードありがとうございました。
こちらのXPでもコードの動作を確認でき、問題は解決しました。
本当にありがとうございました。
jokさん、みていたらお返事がほしいのですが、、、
TfrmPetStatusWindowというウィンドウの中の、
TURLRichEditというコンポーネントから吸い取る場合は
どうしたらいいでしょう?
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;
とすることで解決できました。
解決後のレスを書いてすみませんでした。。
> 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さん、ごめんなさい。自己解決しました。。。
呼び出してすみませんでした。。
また何かあったらお願いしますね!
ツイート | ![]() |