Q&A

  • 윈도우의 핸들 얻기

CUSTOMER.EXE 는 LOADER.EXE를 실행 해서 띄우게 되어 있구요
얻고자 하는 윈도우 핸들은 CUSTOMER.EXE의 핸들,
또는 그 자식의 핸들 인데요
FindWindow(), 또는 FindWindowEx()를 쓰려면
클래스명이나 윈도우 명을 알아내야 되지요?
부모의 핸들을 얻고자 다음과 같이 하면 전부 0이나옵니다.

wH:=FindWindow(nil,'CUSTOMER');
wH:=FindWindow('CUSTOMER',nil);
wH:=FindWindow('{Afx:400000:b:13ae:6:37e7}','CUSTOMER');
wH:=FindWindow('Afx:400000:b:13ae:6:37e7','CUSTOMER');

Customer.exe는 직접 실행이 안되고 Loader.exe를 통해야 됩니다.
이를 실행 시킨후 WinSight로 보면 다음과 같이 나옵니다.
----
<>Overlapped 00000964 {Afx:400000:b:13ae:6:37e7} CUSTOMER.EXECUSTOMER.EX (0,0)-(800.600) "Customer"
├<>Child 0000096c {#32770:Dialog} CUSTOMER.EXE?.? (0.0)-(764.552)
│├<>Child 00000FA8 {#32770:Dialog} CUSTOMER.EXE?.? (0.60)-(799.599)
││├<>Child 00000FA4 {Edit} CUSTOMER.EXE?.? (101.39)-(196.59)
││├<>Child 00000FD4 {Edit} CUSTOMER.EXE?.? (311.39)-(404.59)
:  :  :  :
----
위의 WinSight의 정보 중에서 크래스명또는 윈도우명을
어떻게 찾아내야 하나요?
1  COMMENTS
  • Profile
    최용일 2002.05.08 03:37
    안녕하세요. 최용일입니다.

    아래와 같이 해보세요...

    wH := FindWindow(PChar('Afx:400000:b:13ae:6:37e7'),  'CUSTOMER');

    PChar로 변환안해주면 못찾더군요...

    이것두 제대로 못찾는 것이 있더군요... 쩝~~~ 전체 윈도우리스트에서 찾으면 확실할겁니다...

    type
        TWndInfo = record
            Name: string[128];
            Wnd: THandle;
        end;

    function EnumWindowsProc(Wnd: HWND; WndInfo: PWndInfo): BOOL; stdcall;
    var
        ClassName: array[0..128] of Char;
    begin
        Result := True;
        Windows.GetClassNameA(Wnd, ClassName, SizeOf(ClassName));
        if CompareText(ClassName, WndInfo.Name) = 0 then
        begin
            Result := False;
            WndInfo.Wnd := Wnd;
        end;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var
        WndInfo: TWndInfo;
    begin
        WndInfo.Name := 'Afx:400000:b:13ae:6:37e7';
        WndInfo.Wnd := 0;
        EnumWindows(@EnumWindowsProc, Integer(@WndInfo));
        if WndInfo.Wnd <> 0 then
            ShowMessage('윈도우핸들: ' + IntToHex(WndInfo.Wnd, 8));
    end;

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