Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2012, 07:48   #1
HellMercenariess
Форумчанин
 
Аватар для HellMercenariess
 
Регистрация: 27.07.2009
Сообщений: 547
По умолчанию Перечисление доч. окон, проблемы с HWND

Не выполняет EnumChildWindows(wnd,@EnumClasses,0 ) если подавать существующий hwnd главного окна
Код:
Var
  Wnd : hWnd;
begin
vMode:=ReadOnly;
Elements:=0;
  SchStr:=RadioGroup1.Items.Strings[RadioGroup1.ItemIndex];
wnd:=FindWindow(nil,pChar(SchStr));
AppWnd:=wnd;
 if(Wnd>0)then
 EnumChildWindows(wnd,@EnumClasses,0);

Memo1.Lines.Add(IntToStr(wnd));
зато выполняет если hwnd=0 (несуществующий), перечисляет все классы для всех окон
Код:
function EnumClasses(HWND:hWnd; lParam:Integer):BOOL;stdcall;
 var
  buff: Array [0..127] OF Char;
   s:string;
 var Params: TCreateParams;
begin
    SetLength(s,256);
    SetLength(s,GetClassName(HWND,PChar(@s[1]),256));
       form1.listBox1.items.Add(s);
       if s='ComboBox' then
        Begin

        cbId := GetDlgCtrlId(HWND);
     if (VMode=Remember)then
       Begin
        inc(Numer);
     ind:=SendMessage(hwnd,CB_GetCurSel,0,0);
     indexes[Numer]:=ind;
         Form1.Memo1.Lines.add('Çíà÷åíèÿ çàïàìÿòîâàíû'+IntToStr(indexes[Numer])+' '+IntToStr(Numer));
       End;
     if(VMode=SetUp)then
      Begin
          inc(Numer);
          SendMessage(hwnd,CB_SETCURSEL,indexes[Numer],0);
          SendMessage(AppWnd, WM_COMMAND, MakeWParam(cbId,CBN_SELCHANGE),HWND);
        Form1.Memo1.Lines.add('Çíà÷ óñòàíîâëåíû'+IntToStr(indexes[Numer])+' '+IntToStr(Numer));
       End;
      End;

      if s='ComboLBox' then
       Begin

        cbId := GetDlgCtrlId(HWND);
     if (VMode=Remember)then
       Begin
        inc(Numer);
     ind:=SendMessage(hwnd,CB_GetCurSel,0,0);
     indexes[Numer]:=ind;
         Form1.Memo1.Lines.add('Çíà÷åíèÿ çàïàìÿòîâàíû'+IntToStr(indexes[Numer])+' '+IntToStr(Numer));
       End;
     if(VMode=SetUp)then
      Begin
          inc(Numer);
          SendMessage(hwnd,CB_SETCURSEL,indexes[Numer],0);
          SendMessage(AppWnd, WM_COMMAND, MakeWParam(cbId,CBN_SELCHANGE),HWND);
        Form1.Memo1.Lines.add('Çíà÷ óñòàíîâëåíû'+IntToStr(indexes[Numer])+' '+IntToStr(Numer));
       End;


       end;
    form1.listBox1.items.Add(StrPas(buff));
    inc(elements);
   form1.liblabel1.Caption:=IntToStr(elements);
    Result:=true;
end;
пробовал вот так установить значение для нужного окна, не понимаю почему не прокатило?
Код:
AppWnd:=787154;
"Виновник этого парада,он не дурак, ушел как надо!" Похороны панка.

Последний раз редактировалось HellMercenariess; 27.08.2012 в 07:52.
HellMercenariess вне форума Ответить с цитированием
Старый 27.08.2012, 08:51   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Не прокатило совсем или не нашло имена классов ComboBox и ComboLBox? А почему не TComboBox и TComboLBox?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.08.2012, 10:03   #3
HellMercenariess
Форумчанин
 
Аватар для HellMercenariess
 
Регистрация: 27.07.2009
Сообщений: 547
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Не прокатило совсем или не нашло имена классов ComboBox и ComboLBox? А почему не TComboBox и TComboLBox?
Я через WinSight сначала выследил как называются нужные обьекты, тут не с коробками проблема, коробки на отлично ищутся-находятся при hwnd=0 , тоесть все Комбо_боксы всех приложений и с них даже считывает значения, хотя я заметил что в одном случае неверные.
Совсем ничего не находит если давать существующий Hwnd окна.

там в конце функции вывод строчки, по этому видно что эта функция не исполняется совсем.
Код:
form1.listBox1.items.Add(StrPas(buff));
    inc(elements);
   form1.liblabel1.Caption:=IntToStr(elements);
"Виновник этого парада,он не дурак, ушел как надо!" Похороны панка.

Последний раз редактировалось HellMercenariess; 27.08.2012 в 10:06.
HellMercenariess вне форума Ответить с цитированием
Старый 27.08.2012, 10:49   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

А что возвращает EnumChildWindows и что говорит GetLastError?
waleri вне форума Ответить с цитированием
Старый 27.08.2012, 10:53   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
function EnumClasses(HWND:hWnd; lParam:Integer):BOOL;stdcall;
var s:string;
begin
  SetLength(s,256);
  SetLength(s,GetClassName(HWND,PChar(@s[1]),256));
  Form2.Memo1.Lines.Add(s);
  Result:=true;
end;

procedure TForm2.Button5Click(Sender: TObject);
var s: String;
    Wnd: hWnd;
begin
  s:=Caption;
  wnd:=FindWindow(nil,pChar(s));
  if (Wnd>0) then EnumChildWindows(wnd,@EnumClasses,0);
end;
Изображения
Тип файла: png Безымянный.PNG (3.1 Кб, 79 просмотров)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.08.2012, 11:46   #6
HellMercenariess
Форумчанин
 
Аватар для HellMercenariess
 
Регистрация: 27.07.2009
Сообщений: 547
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
А что возвращает EnumChildWindows и что говорит GetLastError?
Надо было сразу вам больше пояснить в чем дело, дело в корректном нахождении hwnd
wnd:=FindWindow(,);
вся соль изначально была в том что невозможно точно прописать название искомого окна из-за того что оно или очень длинное или некорректное.
В самом первом случае с которым мне довелось столкнутся в названии окна был символ ' и отослать такой код
Код:
wnd:=FindWindow(nil,'programme's Habermann');
не было возможности, это было решено таким способом что я начал размещать искомое название в TRadioGroup, и уже оттуда получал подходящую строку со всеми символами.
Все найденные дочерние контролы я помещал в список и вел учет сколько чего добавляется для какого окна, так было замечено что если искать окно которого нет(тогда я не делал проверки if (Wnd>0) then) то в список с помощью EnumClasses добавляется от 200 до 350 элементов, если искомое окно загружено то кол-во. = 35-70
Сейчас надо было искать окно с очень длинным названием, там еще тире какое-то длинное было, прописать я точно это не смог, но уже умел искать все полнофункциональные окна вот так
Код:
 VAR
Wnd : hWnd;
buff: ARRAY [0..127] OF Char;
begin  begin
ListBox1.Clear;
Wnd := GetWindow(Handle, gw_HWndFirst);
WHILE Wnd <> 0 DO BEGIN
IF
{-Ñîáñòâåííîå îêíî} (Wnd <> Application.Handle)  AND
(GetWindowText(Wnd, buff, sizeof(buff)) <> 0)
THEN begin
GetWindowText(Wnd, buff, sizeof(buff));
if not isignored(StrPas(buff))then   
ListBox1.Items.Add(StrPas(buff));
end;
Wnd := GetWindow(Wnd, gw_hWndNext);
END;
чем и воспользовался, скопировал точное название и дополнительно сделал механизмы чтобы вывести Hwnd на метку и в Мемо.
Теперь хорошо видно что я отсылаю здесь
wnd:=FindWindow(,искомая_строка); верно и получаю hwnd из шести цифр но почему-то не выполняется вот здесь
Код:
  EnumChildWindows(wnd,@EnumClasses,0);
"Виновник этого парада,он не дурак, ушел как надо!" Похороны панка.

Последний раз редактировалось HellMercenariess; 27.08.2012 в 11:49.
HellMercenariess вне форума Ответить с цитированием
Старый 27.08.2012, 11:52   #7
xoodoo
Форумчанин
 
Регистрация: 11.04.2012
Сообщений: 212
По умолчанию

Главное окно приложения (Application.Handle) не имеет ничего общего (кроме уровня - top-level) с окном главной формы приложения (ApplicationMainForm.Handle), на которой собственно и находятся искомые окна дочерних контролов.

У окна Application.Handle действительно нет дочерних окон, если в ран-тайм явно не приложить к этому ручки.
xoodoo вне форума Ответить с цитированием
Старый 03.09.2012, 21:05   #8
HellMercenariess
Форумчанин
 
Аватар для HellMercenariess
 
Регистрация: 27.07.2009
Сообщений: 547
По умолчанию

А как находить hwnd для таких окон как во вложении? Опера еще этим страдает - добавлять название файла или страницы в заголовок.
Есть еще какие-то способы поиска кроме этих?
Код:
   FindWindow(  )  и
   GetWindow(, gw_HWndFirst);
Изображения
Тип файла: jpg FindHWND.JPG (8.6 Кб, 70 просмотров)
"Виновник этого парада,он не дурак, ушел как надо!" Похороны панка.
HellMercenariess вне форума Ответить с цитированием
Старый 03.09.2012, 21:31   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

у окон между прочим еще есть класс.
+ можно фильтровать по процессу.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.09.2012, 18:31   #10
HellMercenariess
Форумчанин
 
Аватар для HellMercenariess
 
Регистрация: 27.07.2009
Сообщений: 547
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
у окон между прочим еще есть класс.
Класс окна может называться так?
Plat::Window{DB3DC0D7-BBA3-4}
Сейчас пробовал выполнить поиск двумя способами по названию окна которое видно через диспетчер задач и по этому что написал выше, посмотроел через WinSight и они совпали.

Соответственно
Код:
1  wnd:=FindWindow(nil,pchar(SchStr));
 2 wnd:=FindWindow(pchar(Strr),nil);
"Виновник этого парада,он не дурак, ушел как надо!" Похороны панка.

Последний раз редактировалось HellMercenariess; 04.09.2012 в 18:35.
HellMercenariess вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перечисление внутри структуры Form_13 Помощь студентам 6 02.08.2011 13:38
Не работает перечисление (enum). Casper-SC Общие вопросы .NET 3 01.02.2010 18:16
Перечисление юзеров doniyor Работа с сетью в Delphi 5 24.01.2010 23:24
Перечисление свойств элемента управления YuraL Microsoft Office Excel 2 08.03.2009 13:02
Перечисление компонентов Zeraim Свободное общение 5 30.11.2008 20:20