他のアプリのEditに入ってる値は、
キーボード送信
Keybd_event(VK_CONTROL,0,0,0);
Keybd_event(Byte('C'),0,0,0);
Keybd_event(Byte('C'),0,KEYEVENTF_KEYUP,0);
Keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
Edit1.Clear;
Edit1.PasteFromClipboard;
で取得できましたが、変更のできないコンボボックスのデータが
取得できません。できれば、選択されているデータを取得したいのですが、
たぶんできないと思いますので、せめてインデックスだけでも
取得できればいいなと思っています。
よろしくお願いします。
これでいかがでしょうか?
テスト用
Formを開きComboBoxを配置し、ComboBoxに適当にデータを入力。
FormのCaptionをComboBoxTestにしておく。
(FindWindowで見つけやすくするため)
受信側
FormにMemoとButtonを1個ずつ配置。
ButtonのOnClickに下記のプログラムを割り当てる。
implementation
type
PHWndArray = ^THWndArray;
THWndArray = array[0..500] of HWND;
function EnumChildWndProc(hWindow:HWND;lData:LPARAM) : Boolean;
var
pWA:PHWndArray;
begin
pWA := PHWndArray(lData);
pWA^[0] := pWA^[0]+1;
pWA^[pWA^[0]] := hWindow;
result := true;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
WND : HWND;
WNDA : THWndArray;
c : array [0..255] of Char;
i : Integer;
begin
// ComboboxのあるFormのハンドルを入手。
WND := FindWindow('TForm1', 'ComboBoxTest');
if WND = 0 then
begin
Memo1.Lines.Add('対象のFormを発見できませんでした。');
Exit;
end;
WNDA[0] := 0;
// 対象のFormに配置されているウィンドウのハンドルを一覧にして入手。
EnumChildWindows(WND, @EnumChildWndProc, LPARAM(@WNDA));
if WNDA[0] <> 0 then
begin
// 一覧中からTComboBoxのウィンドウハンドルを探す。
GetClassName(WNDA[i], c, SizeOf(c));
i := 1;
while (i <= WNDA[0]) and (c <> 'TComboBox') do
begin
inc(i);
GetClassName(WNDA[i], c, SizeOf(c));
end;
if c = 'TComboBox' then
begin
// ComboBoxから表示しているデータを入手。
SendMessage(WNDA[i], WM_GETTEXT, SizeOf(c), Integer(@c));
if c <> '' then
Memo1.Lines.Add(Format('Combobox = %s', [c]));
end
else
Memo1.Lines.Add('Comboboxが見つかりませんでした。');
end;
end;
ありがとうございます。
思い通りのことが実現できました、
しかも値の取得を教えて頂いて、感謝です。
あと、このコンボが複数あるのでどのコンボが
どういった値かを知りたいです。
せめてこのコンボの位置・座標だけでも
わかれば、それで判定するようにしたい
と思います。
ComboBoxの座標を知るには、Win32 APIのGetWindowRectを使えば可能です。
複数個のComboBoxから値を得るには、WNDAから全てのウィンドウハンドルの
ウィンドウクラスを調べ、ウィンドウクラスがTComboBoxと一致するものの値を
取得することにより可能です。
i := 1;
while i <= WNDA[0] do
begin
// 一覧中からTComboBoxのウィンドウハンドルを探す。
GetClassName(WNDA[i], c, SizeOf(c));
while (i <= WNDA[0]) and (c <> 'TComboBox') do
begin
inc(i);
GetClassName(WNDA[i], c, SizeOf(c));
end;
if c = 'TComboBox' then
begin
// ComboBoxから表示しているデータを入手。
SendMessage(WNDA[i], WM_GETTEXT, SizeOf(c), Integer(@c));
// rはTRect型
GetWindowRect(WNDA[i], r);
Memo1.Lines.Add(Format('x = %d, y = %d, Combobox = %s', [r.left, r.top, c]));
end;
inc(i);
end;
ComboBoxのCaptionではだめですか?
GetWindowText(WNDA[i], c, SizeOf(c));
一連のレスを無視してのレスです。ご了承下さい。
>選択されているデータを取得したいのですが、
>たぶんできないと思いますので、せめてインデックスだけでも
なぜこう考えたのかわかりませんが、他のアプリがどんなアプリかにもよります。
(1)他のどの言語でできているか全く不明。
(2)Delphiで作成されているが、ソースコードはない。
(3)Delphiで作成されていて、ソースコードがあり変更は自由である。
等々。
(3)の場合であれば比較的容易に実現可能と思われます(それでもいくつかの
方法があります)。
また、今回の場合は、(多分Delphi5以上であれば)バージョンは関係ないと
思いますが、ご自分の開発環境(DelphiとWindowsの)も情報があればと
思います。
AL様
>>ComboBoxの座標を知るには、Win32 APIのGetWindowRectを使えば可能です。
>>複数個のComboBoxから値を得るには、WNDAから全てのウィンドウハンドルの
>>ウィンドウクラスを調べ、ウィンドウクラスがTComboBoxと一致するものの値を
>>取得することにより可能です。
完璧です。とても助かりました、ありがとうございました。
ぺけぽん様
>>ComboBoxのCaptionではだめですか?
>>GetWindowText(WNDA[i], c, SizeOf(c));
ありがとうございます、ただ、これでは、
ComboBoxの現在選択されているアイテムの値が返ってきました。
Mr.XRAY様
>>一連のレスを無視してのレスです。ご了承下さい。
>>なぜこう考えたのかわかりませんが、他のアプリがどんなアプリかにもよります。
>>(1)他のどの言語でできているか・・・
>>ご自分の開発環境(DelphiとWindowsの)も情報があればと
思います。
すいません、自分の環境等ぜんぜん書いてませんでした。
今回は(1)のパターンです。
以下、質問には直接関係のないことですが・・・、
現在、親会社(うちはその子会社(親会社のシステム開発全般))が、
ある業務で、とある会社の製品を使用しているのですが、
この製品が使えない、使えない、使えない。
といっても、このアプリで全業務を動かしているために、
使わないわけにはいかないのが現状です。
(この部分を使わないと会計に響くとか・・・。)
ので、独自でシステムを開発し、その際に、
ある画面(とある会社の製品)から、独自画面(とある会社の製品では
不足している項目があるので項目を追加してます)に情報を持ってくる
ということから、この質問をしました。
解決チェック忘れてました。
ツイート | ![]() |