Имеются два окна верхнего уровня, назовем их W64 и W32, соответственно из 64-битного и из 32-битного процессов. Есть задача разместить окно W32 таким образом, что бы оно всегда было поверх окна W64. Является ли корректным вызов SetWindowLongPtr(W64, GWLP_HWNDPARENT, W32) (или SetWindowLongPtr(W32, GWLP_HWNDPARENT, W64)). По тестам вроде как работает, но что то мучают меня сомнения.
Re: SetWindowLongPtr(GWLP_HWNDPARENT) для хендлов из разных процессов
Здравствуйте, Aniskin, Вы писали:
A>Имеются два окна верхнего уровня, назовем их W64 и W32, соответственно из 64-битного и из 32-битного процессов. Есть задача разместить окно W32 таким образом, что бы оно всегда было поверх окна W64. Является ли корректным вызов SetWindowLongPtr(W64, GWLP_HWNDPARENT, W32) (или SetWindowLongPtr(W32, GWLP_HWNDPARENT, W64)). По тестам вроде как работает, но что то мучают меня сомнения.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, Aniskin, Вы писали:
A>>Является ли корректным вызов SetWindowLongPtr(W64, GWLP_HWNDPARENT, W32) (или SetWindowLongPtr(W32, GWLP_HWNDPARENT, W64)).
PD>А ее вообще можно для этой цели вызывать ?
Вот и я в сомнениях. Но не вижу иной возможности решить свою задачу.
PD>Do not call SetWindowLongPtr with the GWLP_HWNDPARENT index to change the parent of a child window.
У меня не child, а окна верхнего уровня.
Re[3]: SetWindowLongPtr(GWLP_HWNDPARENT) для хендлов из разных процессов
Здравствуйте, Aniskin, Вы писали:
PD>>Do not call SetWindowLongPtr with the GWLP_HWNDPARENT index to change the parent of a child window.
A>У меня не child, а окна верхнего уровня.
Я понимаю. Но в то же время я расцениваю эту фразу так : не пытайтесь взять эту константу и применить здесь, хоть она и из этой оперы,но ее не надо применять с Set
With best regards
Pavel Dvorkin
Re: SetWindowLongPtr(GWLP_HWNDPARENT) для хендлов из разных процессов
Здравствуйте, Aniskin, Вы писали:
A>Имеются два окна верхнего уровня, назовем их W64 и W32, соответственно из 64-битного и из 32-битного процессов. Есть задача разместить окно W32 таким образом, что бы оно всегда было поверх окна W64. Является ли корректным вызов SetWindowLongPtr(W64, GWLP_HWNDPARENT, W32) (или SetWindowLongPtr(W32, GWLP_HWNDPARENT, W64)). По тестам вроде как работает, но что то мучают меня сомнения.
А обычный SetParent в связке с WS_POPUP не работает?
Re[2]: SetWindowLongPtr(GWLP_HWNDPARENT) для хендлов из разных процессов
Другой вопрос, делает ли этот код то, что вам надо.
Хитрые заманухи с владением / родительством окон могут приводить к неожиданным побочным эффектам.
Кроме того, ваш код будет размещать ваше окно поверх родительского окна целевого приложения.
Если оно вдруг наплодит еще дочерних окон или как-то их отсортирует, то ваше окно может все равно оказаться перекрыто.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Здравствуйте, Aniskin, Вы писали:
CEM>>А обычный SetParent в связке с WS_POPUP не работает?
A>Мои эксперименты не дали положительного результата. Может я неправильно готовлю SetParent?
В общем, странно, но у меня тоже ничего не получилось сейчас. Детём он становится, а попапиться не хочет.
Я поднял с блокнота окно эбаут и на блокнот же (он 64 бита) накинул SetParent-ом своё окно
В результате у них отличается Ancestor, Owner и Parent. Как их задать, я не понял.
Но! Если после подъёма окна эбаут, раздизаблить родителя, эти два окна ведут себя ровно как описано: одно всегда поверх другого, с родителем можно работать, при свёртывании родителя детё сворачивается. И разворачивается с родителем.
Поэтому, есть как минимум, такой извращенский вариант: в 64 битном поднять что-нибудь в DialogBox, а потом на него ребёнком накинуть своё окно.