SetWindowLongPtr(GWLP_HWNDPARENT) для хендлов из разных процессов
От: Aniskin  
Дата: 28.02.16 11:03
Оценка:
Имеются два окна верхнего уровня, назовем их W64 и W32, соответственно из 64-битного и из 32-битного процессов. Есть задача разместить окно W32 таким образом, что бы оно всегда было поверх окна W64. Является ли корректным вызов SetWindowLongPtr(W64, GWLP_HWNDPARENT, W32) (или SetWindowLongPtr(W32, GWLP_HWNDPARENT, W64)). По тестам вроде как работает, но что то мучают меня сомнения.
Re: SetWindowLongPtr(GWLP_HWNDPARENT) для хендлов из разных процессов
От: Pavel Dvorkin Россия  
Дата: 28.02.16 14:02
Оценка:
Здравствуйте, Aniskin, Вы писали:

A>Имеются два окна верхнего уровня, назовем их W64 и W32, соответственно из 64-битного и из 32-битного процессов. Есть задача разместить окно W32 таким образом, что бы оно всегда было поверх окна W64. Является ли корректным вызов SetWindowLongPtr(W64, GWLP_HWNDPARENT, W32) (или SetWindowLongPtr(W32, GWLP_HWNDPARENT, W64)). По тестам вроде как работает, но что то мучают меня сомнения.


А ее вообще можно для этой цели вызывать ?

Вот здесь

https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms644898(v=vs.85).aspx

этот параметр вообще для SetWindowLongPtr не приведен, а в примечаниях сказано

Do not call SetWindowLongPtr with the GWLP_HWNDPARENT index to change the parent of a child window. Instead, use the SetParent function.

Так что такое как минимум подпадает под использование недокументированных возможностей.
With best regards
Pavel Dvorkin
Re[2]: SetWindowLongPtr(GWLP_HWNDPARENT) для хендлов из разных процессов
От: Aniskin  
Дата: 28.02.16 14:17
Оценка:
Здравствуйте, 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) для хендлов из разных процессов
От: Pavel Dvorkin Россия  
Дата: 29.02.16 02:30
Оценка:
Здравствуйте, 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) для хендлов из разных процессов
От: CEMb  
Дата: 29.02.16 04:39
Оценка:
Здравствуйте, 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  
Дата: 29.02.16 05:41
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>А обычный SetParent в связке с WS_POPUP не работает?


Мои эксперименты не дали положительного результата. Может я неправильно готовлю SetParent?
Re: SetWindowLongPtr(GWLP_HWNDPARENT) для хендлов из разных
От: VTT http://vtt.to
Дата: 29.02.16 07:20
Оценка: 1 (1)
В целях обратной совместимости дескрипторы окон всегда занимают 32 бита.
Поэтому их можно спокойно использовать независимо от битности создавшего их процесса.
https://msdn.microsoft.com/en-us/library/windows/desktop/aa384203%28v=vs.85%29.aspx

Другой вопрос, делает ли этот код то, что вам надо.
Хитрые заманухи с владением / родительством окон могут приводить к неожиданным побочным эффектам.
Кроме того, ваш код будет размещать ваше окно поверх родительского окна целевого приложения.
Если оно вдруг наплодит еще дочерних окон или как-то их отсортирует, то ваше окно может все равно оказаться перекрыто.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Отредактировано 29.02.2016 7:21 VTT . Предыдущая версия .
Re[3]: SetWindowLongPtr(GWLP_HWNDPARENT) для хендлов из разных процессов
От: CEMb  
Дата: 29.02.16 09:08
Оценка:
Здравствуйте, Aniskin, Вы писали:

CEM>>А обычный SetParent в связке с WS_POPUP не работает?


A>Мои эксперименты не дали положительного результата. Может я неправильно готовлю SetParent?


В общем, странно, но у меня тоже ничего не получилось сейчас. Детём он становится, а попапиться не хочет.
Я поднял с блокнота окно эбаут и на блокнот же (он 64 бита) накинул SetParent-ом своё окно
В результате у них отличается Ancestor, Owner и Parent. Как их задать, я не понял.
Но! Если после подъёма окна эбаут, раздизаблить родителя, эти два окна ведут себя ровно как описано: одно всегда поверх другого, с родителем можно работать, при свёртывании родителя детё сворачивается. И разворачивается с родителем.
Поэтому, есть как минимум, такой извращенский вариант: в 64 битном поднять что-нибудь в DialogBox, а потом на него ребёнком накинуть своё окно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.