Показать сообщение отдельно
  #8  
Старый 20.04.2009, 14:38
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

одинадцатый, я в процессе отладки заголовки окон считывала немного по-другому. Поскольку имеется постоянно доступный массив, где хранятся дескрипторы всех найденных окон, то необязательно загромождать функцию 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 было по три записи для каждой из запущенных копий программ:
  1. заголовок главной формы;
  2. заголовок еще одной (дополнительной) формы, которая тоже появляется при запуске программы;
  3. заголовок кнопки самой программы на панели задач.
На самом деле, всё ведь зависит от того приложения, которое вы запускаете. Значит, если у вас в Memo оказывается куча пустых строчек, то у программы столько открытых окон, имеющих пустой заголовок...
Цитата:
Сообщение от одинадцатый
допустим что при запуске пары копий нужной мне проги открывается лишь главная форма. значит получить дескрипторы всех окон на ней я могу так же через функцию EnumThrWndProc правильно?
Заметьте: так можно получить дескрипторы лишь окон, не являющихся дочерними. Например, вы таким образом не получите handle какой-нибудь кнопки или поля ввода на форме (это тоже окна!). В посте #2 я говорила, что нужно сделать, чтобы перебирать еще и дочерние окна.
Цитата:
Сообщение от одинадцатый
не ясно почему в строке EnumThreadWindows(_pi.dwThreadId, @EnumThrWndProc, i); мы не передаем параметры для ф-ии EnumThrWndProc
Здесь в этой строчке не происходит вызова функции EnumThrWndProc! Мы просто передаем функции EnumThreadWindows адрес callback функции. Вызывать же ее будет функция EnumThreadWindows самостоятельно, и параметры определять тоже.
Ответить с цитированием