-
Есть программа ABCD.exe Когда она запущена, то видимый заголовок у нее - 'EFGH'.
GetWindowText возвращает 'ABCD', а не 'EFGH'. В диспетчере задач она тоже видна как 'ABCD'. В случае переименования файла в DCBE.exe, GetWindowText возвращает 'DCBE'. При этом title окна не меняется и остается 'EFGH'
Каким образом можно найти окно по заголовку 'EFGH'?
-
а каким образом ты его ищешь?
-
function AddWinInfo(WinHandle: HWnd; List:TStringList): Boolean; stdcall;
var
WinCaption: array[0..255] of Char;
begin
Result:=True;
if isWindowVisible(WinHandle) then
if GetWindow( WinHandle,GW_OWNER )=0 then begin
GetWindowText( WinHandle, WinCaption, SizeOf(WinCaption) );
if WinCaption<>''
then List.Add(IntToStr(WinHandle));
end;
end;
function AppInfo(): string;
var
descript : TStringList;
WinCaption : array[0..255] of char;
i : word;
s: string;
begin
descript:=TStringList.Create;
try
s:='';
with descript do begin
Clear;
EnumWindows( @AddWinInfo, LParam(descript) );
end;
for i:=0 to descript.Count-1 do begin
GetWindowText( StrToInt(descript.strings[i]), WinCaption, SizeOf(WinCaption) );
s:='Текст: '+WinCaption+' Ид:'+descript.strings[i];
if GetClassName( StrToInt(descript.strings[i]), WinCaption, SizeOf(WinCaption) )>0 then
if WinCaption='TApplication'
then result:=result+s+' Class: '+WinCaption+#13#10;
end;
finally
descript.Free;
end;
end;
ShowMessage( AppInfo() );
-
> Fr (28.03.13 22:22)
Посмотри Spy++ что показывает для этого окна
-
> Когда она запущена, то видимый заголовок у нее - 'EFGH'. > > > GetWindowText возвращает 'ABCD', а не 'EFGH'.
Не от того окна вызываешь GetWindowText, пытаешься вызвать от окна TApplication.Handle, а его заголовок по умолчанию совпадает с именем исполняемого файла
-
> Не от того окна вызываешь GetWindowText, пытаешься вызвать > от окна TApplication.Handle, а его заголовок по умолчанию > совпадает с именем исполняемого файла
А как узнать нужное окно, связанное с exe, у которого надо вызвать GetWindowText ?
-
> Fr (29.03.13 21:42) [5]
[3]
-
Переписал. Вот, что получилось в результате. покритикуйте, плиз: function AppInfo(): string;
var
SnapProc : THandle;
ProcEntry: TProcessEntry32;
PID : DWORD;
begin
try
Form1.Hint:='';
SnapProc:=CreateToolhelp32Snapshot( TH32CS_SnapProcess, 0 );
if SnapProc<>Invalid_Handle_Value then
try
ProcEntry.dwSize:=SizeOf( TProcessEntry32 );
if Process32First( SnapProc, ProcEntry ) then
repeat
PID:=ProcEntry.th32ProcessID;
EnumWindows( @EnumWindowsProc, PID );
until not Process32Next( SnapProc, ProcEntry )
finally
CloseHandle( SnapProc )
end
finally
result:=Form1.Hint;
end;
end;
function EnumWindowsProc( Wnd: HWnd; tmpPID: DWORD ): Boolean; stdcall;
var
WinCaption: array[0..255] of char;
WndPID : DWORD;
begin
Result:=True;
GetWindowThreadProcessID( Wnd, @WndPID );
if WndPID=tmpPID then begin
GetWindowText( Wnd, WinCaption, SizeOf(WinCaption) );
if Pos('bla-bla-bla', WinCaption)>0 then begin
Form1.Hint:=Form1.Hint+'(PID='+IntToStr(tmpPID)+') (Wnd='+IntToStr(Wnd)+') '+WinCaption+#13#10;
result:=False;
end;
end
end;
ShowMessage( AppInfo() );
-
> покритикуйте, плиз:
А тебе это вообще зачем надо ?
-
> А тебе это вообще зачем надо ?
Чтобы знать - правильно ли я делаю, нет ли тут скрытых глюков каких-нибудь
-
> Чтобы знать - правильно ли я делаю, нет ли тут скрытых глюков > каких-нибудь
Добиться ты чего хочешь ?
-
> Игорь Шевченко © (30.03.13 14:41) [10]
> > Добиться ты чего хочешь ?
Найти окно по заголовку же! :)
-
> Pos('bla-bla-bla'
> Form1.Hint:=Form1.Hint
сильно!
-
> Найти окно по заголовку же! :)
Обычно для этого FindWindow(Ex) используют, название более подходящее
|