Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

Может ли нарушиться Z-последовательность окон?   Найти похожие ветки 

 
И. Павел ©   (2010-05-31 20:44) [0]

Здравствуйте.
Допустим, я нашел окно с дескриптором A. Не важно, на какой глубине вложенности оно находится. Например, это окно имеет такую иерархию дочерних окон:
A
-AA
--AAA
--AAB
-AB
--ABA
-AC
--ACA
--ACB

Если я буду вызывать функцию FindWindowEx(A, <0 или предыдущий потомок>, <nil или имя какого-то класса>, <nil>) сохранится ли порядок следования дочерних окон: AA, AB, AC, AD:
1. При новом вызове программы A (ну тут, вероятно, он должен сохраниться)
2. При изменении дочерних окон более низкого уровня (например, если удалится AAB и добавятся AAC и AAD и т.д.)?
Подскажите, пожалуйста,  не может ли повлиять на Z-последовательность окон n-ого уровня изменение состава их потомков (n+1, n+2 и т.д. уровней)?

И еще: подскажите, пожалуйста, как будут вести себя в этой же ситуации функции EnumWindows/EnumClildWindows? Не нашел даже упоминания того, что они используют z-последовательность.

Заранее спасибо.


 
И. Павел ©   (2010-05-31 21:22) [1]

На всякий случай уточню, что это не взлом. Просто нужно ускорить работу программу, избавив того, кто с ней работает, от рутинного ввода данных.


 
Leonid Troyanovsky ©   (2010-05-31 21:42) [2]


> И. Павел ©   (31.05.10 20:44)  

> Если я буду вызывать функцию FindWindowEx(A, <0 или предыдущий
> потомок>, <nil или имя какого-то класса>, <nil>) сохранится
> ли порядок следования дочерних окон: AA, AB, AC, AD:
> 1. При новом вызове программы A (ну тут, вероятно, он должен
> сохраниться)

Не должен.


 
Leonid Troyanovsky ©   (2010-05-31 21:45) [3]


> 2. При изменении дочерних окон более низкого уровня (например,
>  если удалится AAB и добавятся AAC и AAD и т.д.)?

Вот, поэтому и не должен.

Sorry, предыидущий пост сорвался.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2010-05-31 21:46) [4]


> И. Павел ©   (31.05.10 21:22) [1]

> ускорить работу программу, избавив того, кто с ней работает

Тут надо подробнее.

--
Regards, LVT.


 
И. Павел ©   (2010-05-31 22:20) [5]

Написал программку, форма которой состоит из трех кнопок и memo1. При щелчке по кнопке button1 в memo1 выводятся имена дочерних окон:
Button3
Button2
Button3
Button2
Button1

То есть все перепуталось…
EnumChildWindow возвращает то же самое. Если не нажимать на кнопку, или следить за чужой программой, этого не происходит, но, наверное, это не единственный случай, когда z-order меняется.


> Тут надо подробнее.

Есть определенная операция, которую выполняет пользователь. Нужно делать ее автоматически. Запустить программу, нажимать на кнопки, вводить в поля данные и т.д. Пока текущая задача небольшая (ввод нескольких значений на одной форме, хотя ее нужно еще открыть), но скорее всего в дальнейшем может разрастись. При этом прямое редактирование базы производить нельзя, т.к. во-первых это нарушение авторских прав, а во-вторых база сложная и недокументированная, и можно просто ее испортить.

Сейчас попробую еще потестировать работу одной программы с другой. Если такое перемешивание окон останется, нужно будет искать другой способ, т.к. нельзя будет различить одноименные окна одного класса.

Подскажите, пожалуйста, клиентские координаты левого верхнего угла программы не могут меняться, например, из-за настроек Windows (как ширина и высота)? Их можно использовать  для идентификации окон? Примерно так:
GetWindowRect(Window, R);
ScreenToClient(Parent, R.TopLeft);
ScreenToClient(Parent, R.BottomRight);

И еще: посоветуйте, пожалуйста, как организовать работу одной программы с другой? Пока думаю перебирать окна, пока не найду окно с нужным Top, Left, Классом и Заголовком.


 
И. Павел ©   (2010-05-31 22:22) [6]


> левого верхнего угла программы

Я ошибся. Имел ввиду: левого верхнего угла окна


 
Leonid Troyanovsky ©   (2010-06-01 08:38) [7]


> И. Павел ©   (31.05.10 22:20) [5]

> Написал программку, форма которой состоит из трех кнопок
> и memo1. При щелчке по кнопке button1 в memo1 выводятся
> имена дочерних окон:
> Button3
> Button2
> Button3
> Button2
> Button1

Не очень понятны повторы, м.б. 3-2-1?

>  Их можно использовать  для идентификации окон?

Нет, конечно. Почему не просто клиентские координаты?

> как организовать работу одной программы с другой?

Для идентификации контролов все может пригодится,
начиная от z-order, кончая GetDlgCtrlID.
Поизучай подопытное приложение Winsigth or Spy.

--
Regards, LVT.


 
И. Павел ©   (2010-06-01 09:44) [8]


> Не очень понятны повторы, м.б. 3-2-1?

Извиняюсь. Видимо я что-то неправильно вчера написал. Сегодня переписал тот пример, и EnumChildWindows выдала каждое окно только один раз.


> Нет, конечно. Почему не просто клиентские координаты?

То есть мне нужно находить координаты таким способом:

var HParent, HChild: HWND;
   r: TRECT;
   p: TPoint;
begin
 …
 HParent := Panel1.Handle;
 HChild := Button1.Handle;
 GetWindowRect(HChild, r);
 p.X := r.Left;
 p.Y := r.Top;
 MapWindowPoints(0, HParent, p, 1);
 Caption := IntToStr(p.x) + ", " + IntToStr(p.y)
 …


И потом сравнивать их с нужными?


 
Leonid Troyanovsky ©   (2010-06-01 12:59) [9]


> И. Павел ©   (01.06.10 09:44) [8]

> > Нет, конечно.

Я тоже чего-то не то написал, не обратил внимание на
ScreenToClient(_Parent_, R.TopLeft); sorry.


procedure TForm1.Button1Click(Sender: TObject);
var
 r: TRect;
 s: String;
begin
 with Sender as TButton do
   begin
     {дельфийские коорд. на форме}
     s := Format("%d %d %d %d", [Left, Top, Left+Width, Top+Height]);
     {апишные коорд. на паренте}
     Windows.GetWindowRect(Handle, r);
     Windows.ScreenToClient(GetParent(Handle), r.TopLeft);
     Windows.ScreenToClient(GetParent(Handle), r.BottomRight);
   end;
 with r do
   s := s+ #13#10+Format("%d %d %d %d", [Left, Top, Right, Bottom]);
 ShowMessage(s);
end;

Только, бывают случаи, когда одни контролы прячут за другими,
т.е., нужно комбинировать с видимостью, z-order &etc.
--
Regards, LVT.


 
И. Павел ©   (2010-06-01 13:39) [10]

Leonid Troyanovsky ©, большое спасибо.


> Только, бывают случаи, когда одни контролы прячут за другими

Наверное, я пока буду проходить по всем дочерним окнам первого уровня, и если найду несколько в одной позиции с одним классом и заголовком, буду писать ошибку в лог. А уже потом, если ошибки будут появляться, буду исправлять их по контексту: либо уточнять информацию об искомом окне, либо искать нужный z-order. Чтобы не спутать, перекрыли окно или оно кого-то перекрыло.


 
Игорь Шевченко ©   (2010-06-02 13:57) [11]

Z-последовательность дочерних окон может измениться только явно вызовом SetWindowPos/SetParent или подобными. Функции типа SetSibling в Windows нету (да и не нужна она)


 
И. Павел ©   (2010-06-02 15:41) [12]

> Игорь Шевченко ©

Спасибо.


 
Игорь Шевченко ©   (2010-06-02 16:00) [13]

И. Павел ©   (02.06.10 15:41) [12]

Забыл дополнить список еще двумя функциями - CreateWindowEx, DestroyWindow.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.079 c
15-1272659402
Юрий
2010-05-01 00:30
2010.08.27
С днем рождения ! 1 мая 2010 суббота


15-1264203683
Petr V. Abramov
2010-01-23 02:41
2010.08.27
пятничный паровоз :)


2-1268640436
Darvin
2010-03-15 11:07
2010.08.27
Возвращение строки PChar, Delphi 2009


6-1219075279
ocean
2008-08-18 20:01
2010.08.27
IdSmtp headers


11-1219772870
Артем
2008-08-26 21:47
2010.08.27
Ticqclient на KOL е





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский