Просто подумал, что буду следить за этим для всех, кто тоже боролся, поскольку я наконец нашел способ сделать это.
IL = уровень целостности.
У меня было 2 приложения, highIL.exe и lowIL.exe, highIL хотел найти окно lowIL.exe, установить его как дочернее окно и переместить в зону, созданную для него на файле highIL.exe. Это было заблокировано UIPI в Vista +.
В конце концов я использовал метод ChangeWindowMessageFilter в Vista и ChangeWindowMessageFilterEx в Windows7, оба из которых находятся в user32.dll. Эти функции позволяют вам проделать дыру в UIPI, чтобы пропустить сообщения, через которые вы хотите пройти.
Я создал несколько пользовательских сообщений с помощью функции RegisterWindowMessage, я использовал эту функцию для регистрации метода как в приложениях highIL, так и lowIL, строка выглядела примерно так:
const UINT MY_MOVEINTWINDOW_MSG = RegisterWindowMessage(_T("MyMsg.MoveWindow"));
Затем lowIL.exe может отправлять эти сообщения в окно highIL.exe без их блокировки. Тогда это был случай простого добавления и написания обработчиков сообщений.
Этот метод будет работать, только если у вас есть доступ как к высокому, так и к низкому IL.
В MSDN также есть рабочий пример функции ChangeWindowMessageFilterEx Веб-сайт