Вы пытаетесь изменить родитель окна. Необходимая функция: SetParent
. Ваш P/Invoke выглядит следующим образом:
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
Из документации:
hWndNewParent
Дескриптор нового родительского окна. Если этот параметр равен NULL, окно рабочего стола станет новым родительским окном.
Итак, вы просто передаете NULL
как hWndNewParent
. В терминах C# это делается следующим образом:
SetParent(hWnd, IntPtr.Zero);
Однако, есть еще. В примечаниях вы найдете этот текст:
Из соображений совместимости, SetParent не изменяет WS_CHILD или стилей окна WS_POPUP из окна которого родитель меняются. Следовательно, если hWndNewParent равно NULL, вы также должны очистить бит WS_CHILD и установить стиль WS_POPUP после вызова SetParent. И наоборот, если hWndNewParent не является NULL, а ранее было дочерним элементом рабочего стола, вы должны очистить стиль WS_POPUP и установить стиль WS_CHILD перед вызовом SetParent.
Итак, в вашем случае вам нужно изменить стиль окна для окна. Вам необходимо очистить WS_CHILD
и установить WS_POPUP
.
uint style = GetWindowLong(hWnd, GWL_STYLE);
style = (style | WS_POPUP) & (~WS_CHILD);
SetWindowLong(hWnd, GWL_STYLE, style);
Вопрос не имеет смысла, у вас нет отдельного «управляемого процесса» в вашем приложении. Есть только один. –
@HansPassant Я попытался исправить свое использование терминологии. –
@ HansPassant «управляемый» не был правильным словом ... Мое приложение использует WindowsFormsHost в качестве родителя для процесса, который он начал. –