他のアプリのコンボボックスのインデックスを取得するには?

解決


灼熱  2006-06-07 02:02:06  No: 22063

他のアプリの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;
で取得できましたが、変更のできないコンボボックスのデータが
取得できません。できれば、選択されているデータを取得したいのですが、
たぶんできないと思いますので、せめてインデックスだけでも
取得できればいいなと思っています。
よろしくお願いします。


AL  2006-06-08 23:32:46  No: 22064

これでいかがでしょうか?

テスト用
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;


灼熱  2006-06-10 01:24:33  No: 22065

ありがとうございます。
思い通りのことが実現できました、
しかも値の取得を教えて頂いて、感謝です。

あと、このコンボが複数あるのでどのコンボが
どういった値かを知りたいです。
せめてこのコンボの位置・座標だけでも
わかれば、それで判定するようにしたい
と思います。


AL  2006-06-10 08:04:49  No: 22066

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;


ぺけぽん  2006-06-10 08:21:40  No: 22067

ComboBoxのCaptionではだめですか?

GetWindowText(WNDA[i], c, SizeOf(c));


Mr.XRAY  URL  2006-06-13 08:33:39  No: 22068

一連のレスを無視してのレスです。ご了承下さい。

>選択されているデータを取得したいのですが、
>たぶんできないと思いますので、せめてインデックスだけでも

なぜこう考えたのかわかりませんが、他のアプリがどんなアプリかにもよります。
(1)他のどの言語でできているか全く不明。
(2)Delphiで作成されているが、ソースコードはない。
(3)Delphiで作成されていて、ソースコードがあり変更は自由である。
等々。
(3)の場合であれば比較的容易に実現可能と思われます(それでもいくつかの
方法があります)。

また、今回の場合は、(多分Delphi5以上であれば)バージョンは関係ないと
思いますが、ご自分の開発環境(DelphiとWindowsの)も情報があればと
思います。


灼熱  2006-06-13 20:30:00  No: 22069

AL様
>>ComboBoxの座標を知るには、Win32 APIのGetWindowRectを使えば可能です。
>>複数個のComboBoxから値を得るには、WNDAから全てのウィンドウハンドルの
>>ウィンドウクラスを調べ、ウィンドウクラスがTComboBoxと一致するものの値を
>>取得することにより可能です。
完璧です。とても助かりました、ありがとうございました。

ぺけぽん様
>>ComboBoxのCaptionではだめですか?
>>GetWindowText(WNDA[i], c, SizeOf(c));
ありがとうございます、ただ、これでは、
ComboBoxの現在選択されているアイテムの値が返ってきました。

Mr.XRAY様
>>一連のレスを無視してのレスです。ご了承下さい。
>>なぜこう考えたのかわかりませんが、他のアプリがどんなアプリかにもよります。
>>(1)他のどの言語でできているか・・・
>>ご自分の開発環境(DelphiとWindowsの)も情報があればと
思います。
すいません、自分の環境等ぜんぜん書いてませんでした。
今回は(1)のパターンです。
以下、質問には直接関係のないことですが・・・、
現在、親会社(うちはその子会社(親会社のシステム開発全般))が、
ある業務で、とある会社の製品を使用しているのですが、
この製品が使えない、使えない、使えない。
といっても、このアプリで全業務を動かしているために、
使わないわけにはいかないのが現状です。
(この部分を使わないと会計に響くとか・・・。)
ので、独自でシステムを開発し、その際に、
ある画面(とある会社の製品)から、独自画面(とある会社の製品では
不足している項目があるので項目を追加してます)に情報を持ってくる
ということから、この質問をしました。


灼熱  2006-06-13 20:30:53  No: 22070

解決チェック忘れてました。


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

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






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