[2]
Когда выше я заявил, что
>3) SetWindowLong/GWL_HWNDPARENT, оказывается, на самом деле устанавливает отношения Owner/Owned
— я, каюсь, сознательно приврал (предполагалось, что мне возразят, и беседа оживится

).
На самом деле устанавливаются отношения, только лишь очень похожие на
Owner/Owned.
Смотрим MSDN -> Window Features -> Owned Windows:
>An overlapped or pop-up window can be owned by another overlapped or pop-up window.
>Being owned places several constraints on a window.
>
>An owned window is always above its owner in the z-order.
Так же и после SetWindowLong.
>The system automatically destroys an owned window when its owner is destroyed.
Полностью зависит от окна, SetWindowLong не в состоянии этого обеспечить... но нередко в этом и нет необходимости.
>An owned window is hidden when its owner is minimized.
Так же и после SetWindowLong.
>After creating an owned window, an application cannot transfer ownership of the window to another window.
Но вот пример, как ParentOwner вроде бы меняет местами owner и owned:
запускаем clpbrd.exe,
из меню окна "Папка обмена" запускаем диалог "О программе",
запускаем ParentOwner (он, кстати, показывает, что окно "Папка обмена" = owner для окна "О программе"),
наводим курсор на заголовок окна "О программе" и шлепаем F8 (=> чекбокс "Lock" метится),
раздизабливаем кнопку "SetWindowLong(GWL_HWNDPARENT)" правым и жмем ее левым кликом,
очищаем чекбокс "Lock",
наводим курсор на заголовок окна "Папка обмена" и шлепаем F9,
жмем кнопку "En/Dis".
наводим курсор на заголовок окна "О программе" и шлепаем F8 (=> чекбокс "Lock" метится),
жмем кнопку "sWaP",
жмем кнопку "SetWindowLong(GWL_HWNDPARENT)".
И теперь окно "О программе" — вроде бы owner для окна "Папка обмена".
Конечно, WM_ENTERIDLE не перенаправился, зато если закрыть окно "О программе", то закроется и окно "Папка обмена", так что owner получился как настоящий.
[Продолжение следует...]