2014-02-07 2 views
-2

Как я могу создать процесс, родительский элемент которого был настроен на управление моим приложением «pop-out» моего приложения и стал окном верхнего уровня?Удалить родительский элемент окна или формы

Я пробовал использовать SetParent(WindowHandle, null);, но IntPtr говорит, что это тип с нулевым значением.

+0

Вопрос не имеет смысла, у вас нет отдельного «управляемого процесса» в вашем приложении. Есть только один. –

+0

@HansPassant Я попытался исправить свое использование терминологии. –

+0

@ HansPassant «управляемый» не был правильным словом ... Мое приложение использует WindowsFormsHost в качестве родителя для процесса, который он начал. –

ответ

3

Вы пытаетесь изменить родитель окна. Необходимая функция: 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); 
1

Проверьте, что родитель любого окна верхнего уровня используется следующее:

[DllImport("User32.dll", SetLastError = true)] 
    public static extern IntPtr GetParent(IntPtr hWnd); 

В результате «0».

Таким образом, вы можете сделать ваш процесс стал окном верхнего уровня, как так:

SetParent(WindowHandle, IntPtr.Zero); 
Смежные вопросы