Q&A

  • 같은 클래스(edit)의 핸들얻어 서로 다른값 넣기




제가 지금 만들고있는 프로그램은 autocad를 자동으로 다음단계로 넘어가도록 버튼을 클릭해주고 시리얼입력하는 edit에 자동으로 값을 넣어주는 프로그램을 만들고있습니다. 버튼이나 그런것은 캡션이 있어서 구분하여 핸들을 얻어 올수있는데 첨부된 화일에 보시는 것같은 구조는 enumchildwindow나 그런것으로 알아내지를 못하겟더군요. 초보라 모르는것이 너무 많습니다. 델파이 사이트들 게시판을 1주일넘게 다 뒤져보았는데 명령어만알뿐 구현이 안되더군요. 보시고 간단하게 코딩을 해주시거나 알려주시면 감사하겠습니다.

스파이 화면을 보시면 아시겠지만 static 밑에 edit가 3개가 똑같이 있는데 이 edit들의  class atom,classname들이 다 동일하고 text도 없는상태이기때문에 알아올수가 없더군요.

제가 원하는것은 맨위의 edit에는 123을 넣고 두번째 edit 에는 34567을 세번째에는 a1b2c3를 넣으려고합니다.

고수님들 한수부탁드립니다. 꼭좀 도와주세요.

제가 코딩한 것은 아래와같습니다.(아래는 ie주소창에 data넣는방법을 참고해서 만들어본것입니다.)
이렇게 해보았는데 안되더군요.

unit umain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  SendData1,SendData2,SendData3 : string;
  function EnumChildProc(AHnd: hWnd): BOOL; stdcall;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
   wnn : integer;
begin
   wnn:=FindWindow('msidialogcloseclass','autocad 2002 setup');
   if wnn <> 0 then begin
       SendData1 := Edit1.Text;
       SendData2 := Edit2.Text;
       SendData3 := Edit3.Text;
       EnumChildWindows(wnn, @EnumChildProc, 0);
   end;
end;

function EnumChildProc(AHnd: hWnd): BOOL; stdcall;
var
   S : string;
   ClassName : array[0..255] of Char;
   fRect : TRect;
   e1,e2,e3 : THandle;
begin
   Result := True;
   GetClassName(AHnd, ClassName, 255);
   S := ClassName;
   if S = 'Edit' then begin
       E1 := FindWindowEx(AHnd,0,'TEdit',nil);
       if getWindowRect(AHnd, fRect) then begin
          SendMessage(AHnd, WM_SETTEXT, 0, LParam(Pchar(SendData1)));
          end;
       E2 := FindWindowEx(AHnd,e1,'TEdit',nil);
       if getWindowRect(e2, fRect) then begin
          SendMessage(e2, WM_SETTEXT, 0, LParam(Pchar(SendData2)));
          end;
       E3 := FindWindowEx(AHnd,e2,'TEdit',nil);
       if getWindowRect(e3, fRect) then begin
          SendMessage(e3, WM_SETTEXT, 0, LParam(Pchar(SendData3)));
          end;
   end;
end;
end.
1  COMMENTS
  • Profile
    최용일 2007.01.04 06:15
    안녕하세요. 최용일입니다.

    EnumWindows로 에디트 세개 찾으시구요. GetClientRect으로 ClientRect 구하신뒤에 Width를 비교해보세요. 세개가 모두 폭이 다른것 같네요...

    ClassName이 Edit인데 FindWidnowEx에서 TEdit로 검색하는군요...

    ^^ 항상 즐코하세요...