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의 정보 중에서 크래스명또는 윈도우명을
어떻게 찾아내야 하나요?
아래와 같이 해보세요...
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;
^^ 항상 즐코하세요...