Я разрабатываю плагин (C ++ / CLI DLL), который запускается внутри определенных приложений, о которых я знаю только HWND. Мой плагин показывает различные формы .NET, которые я хотел бы вести как дочерние элементы основного приложения (например, по центру главного окна и т. Д.). Вот что я попробовал:
// MyDialog.h
public ref class MyDialog : public System::Windows::Forms::Form {
public:
MyDialog(const int parentHWND);
private:
IntPtr parent_;
};
// MyDialog.cpp
// Attempt1: Use SetParent and CenterParent
MyDialog::MyDialog(const int parentHWND) : parent_(parentHWND) {
SetParent(reinterpret_cast<HWND>(this->Handle.ToPointer()), reinterpret_cast<HWND>(parent_.ToPointer()));
this->StartPosition = FormStartPosition::CenterParent;
}
Похоже, что MyDialog действует как ребенок (то есть вы не можете переместить его за пределы основного приложения и т. Д.), Но вызов CenterParent не дает желаемых результатов.
Я нашел в сети несколько идей (включая SO ), которые предлагают создать NativeWindow из HWND и передать его в Show ():
// in MyDialog.h
void Show() new;
// MyDialog.cpp
// ...
void MyDialog::Show() {
NativeWindow^ nw = gcnew NativeWindow();
nw->AssignHandle(parent_);
this->Show(nw);
}
Однако, во всех случаях, которые я могу протестировать, происходит сбой основного приложения (интересно, после показа моего диалога). Я обновлю сообщение информацией о сбое, если смогу ее получить.
Я ищу предложения о том, как последовательно добиться желаемого поведения. Все, что мне нужно, это иметь возможность центрировать немодальный диалог в главном окне и заставить его действовать как ребенок.
Любая помощь будет оценена.