одинадцатый, я в процессе отладки заголовки окон считывала немного по-другому. Поскольку имеется постоянно доступный массив, где хранятся дескрипторы всех найденных окон, то необязательно загромождать функцию EnumThrWndProc. Просто делала Memo и еще одну кнопку с вот таким обработчиком события OnClick:
Код:
procedure TForm1.GetTextBtnClick(Sender: TObject);
var
i: Byte;
j: Integer;
wndtxt: PChar;
begin
GetMem(wndtxt, 200);
try
Memo1.Lines.Clear;
for i := 0 to 3 do
for j := 0 to High(ThreadIdHandles[i].Handles) do
begin
GetWindowText(ThreadIdHandles[i].Handles[j], wndtxt, 200);
Memo1.Lines.Add(StrPas(wndtxt));
end;
finally
FreeMem(wndtxt, 200);
end;
end;
В результате у меня в Memo было по три записи для каждой из запущенных копий программ:
- заголовок главной формы;
- заголовок еще одной (дополнительной) формы, которая тоже появляется при запуске программы;
- заголовок кнопки самой программы на панели задач.
На самом деле, всё ведь зависит от того приложения, которое вы запускаете. Значит, если у вас в Memo оказывается куча пустых строчек, то у программы столько открытых окон, имеющих пустой заголовок...
Цитата:
Сообщение от одинадцатый
допустим что при запуске пары копий нужной мне проги открывается лишь главная форма. значит получить дескрипторы всех окон на ней я могу так же через функцию EnumThrWndProc правильно?
|
Заметьте: так можно получить дескрипторы лишь окон, не являющихся дочерними. Например, вы таким образом не получите handle какой-нибудь кнопки или поля ввода на форме (это тоже окна!). В посте #2 я говорила, что нужно сделать, чтобы перебирать еще и дочерние окна.
Цитата:
Сообщение от одинадцатый
не ясно почему в строке EnumThreadWindows(_pi.dwThreadId, @EnumThrWndProc, i); мы не передаем параметры для ф-ии EnumThrWndProc
|
Здесь в этой строчке
не происходит вызова функции EnumThrWndProc! Мы просто передаем функции EnumThreadWindows
адрес callback функции. Вызывать же ее будет функция EnumThreadWindows самостоятельно, и параметры определять тоже.