Форум: "Начинающим";
Текущий архив: 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.063 c