У меня есть приложение .NET 4 WinForm, которое отображает формы из Delphi 7. DLL. Вчера у меня были некоторые вопросы о том, как заставить форму Delphi корректно вести себя, если смотреть на нее модально. На это был дан ответ здесь.
Я экспортирую метод из Delphi.dll, который создает экземпляр формы Delphi, возвращая указатель на эту форму .NET. Я также экспортирую метод отображения формы Delphi. Метод Show имеет два параметра: владелец типа integer; и форма типа Pointer.
Я вызываю метод CreateForm, который создает форму Delphi, передавая объект приложения Delphi в конструктор формы. Я сохраняю возвращаемый указатель в .NET. Затем я вызываю метод Show, передавая дескриптор из основной формы приложения .NET и указателя для формы Delphi.
Затем я присваиваю этому дескрипту свойство Delphi Application.Handle
.
Это решило мою оригинальную проблему.
Теперь у меня есть другие проблемы:
Форма Delphi показывает кнопку на панели задач Windows. Единственным способом, который я нашел до сих пор, чтобы подавить кнопку панели задач, является создание формы Delphi в виде окна инструмента (либо путем установки форм BorderStyle := bsToolWindow
, либо назначения WS_EX_TOOLWINDOW
стилю формы). Мне нужна форма Delphi, чтобы быть нормальной формой стиля, но я не хочу, чтобы кнопка панели инструментов отображалась, подобно тому, как дочерние формы ведут себя в родном приложении Delphi или .NET. А по native я имею в виду, где все приложение написано на данном языке.
Форма Delphi не минимизируется, когда приложение .NET минимизируется. Мне нужна форма Delphi, чтобы свести к минимуму, когда основная форма приложения .NET сведена к минимуму, подобно тому, как дочерние формы ведут себя в родном приложении Delphi или .NET.
Я не уверен, но это похоже на проблему с владением. Похоже, что формы Delphi не "знают", что они являются частью приложения .NET.
Итак, мой основной вопрос: как мне заставить формы Delphi вести себя так, как если бы они были родными формами приложения?
Дальнейшие соображения: Я разрабатываю Windows 7, но приложение также должно вести себя так же на XP и Vista.
После просмотра моего кода я понял, что то, что я изначально разместил, не было на 100% правильным. Я редактировал свой вопрос, чтобы дать более точное описание последовательности событий при создании формы Delphi и назначении Delphi Application.Handle.
Я решил проблему, выполнив следующие действия:
Я изменил метод CreateForm, чтобы принять параметр "owner", вместо того, чтобы передавать его через метод Show.
В методе CreateForm я теперь назначаю свойство Delphi Application.Handle сначала , затем создать форму, передав объект Application в конструктор формы.
Теперь формы приложения и ребенка ведут себя так, как я хочу. На панели задач для форм Delphi нет кнопок, а формы Delphi исчезают, когда основная форма приложения .NET сведена к минимуму и снова появляется при восстановлении основной формы.
Я думаю, что есть много ваших проблем, которые будут решены путем установки владельца форм Delphi.
Вам нужно сделать это через p/invoke:
Вам также нужно знать дескриптор окна ваших окон Delphi.
Кроме того, я думаю, вы могли бы удалить кнопку, о которой говорите, другими, более сложными методами p/invoke. Есть методы, чтобы петля через дочерние окна окна, тогда вы можете отсоединить родительское окно от кнопки и уничтожить ее. Это довольно немного взломать, и было бы трудно получить право, однако.
Вы можете попробовать следующее:
public const int GWL_EXSTYLE = -20;
public const int WS_EX_APPWINDOW = 0x00040000L;
SetWindowLong (hWnd, GWL_EXSTYLE, GetWindowLong (hWnd, GWL_EXSTYLE) | ~ WS_EX_APPWINDOW);
Вы можете найти определения С# p/invoke для SetWindowLong и GetWindowLong в http://pinvoke.net/
Надеюсь, что это поможет.