我有一个 .NET 4 WinForm 应用程序,它显示来自 Delphi 7 .dll 的表单。昨天我有一些关于如何让 Delphi 表单在模态显示时正确运行的问题。已得到答复here .
我从 Delphi .dll 导出一个方法,该方法创建 Delphi 窗体的实例,并将指向该窗体的指针返回到 .NET。我还导出了一个方法来显示 Delphi 表单。 Show方法有两个参数:所有者类型为整数;和指针类型的形式。
我调用 CreateForm 方法,该方法创建 Delphi 表单,并将 Delphi 的 Application 对象传递给表单的构造函数。我将返回的指针存储在.NET 中。然后,我调用 Show 方法,传递 .NET 应用程序主窗体的句柄和 Delphi 窗体的指针。
然后我将该句柄分配给 Delphi 的 Application.Handle
属性。
这解决了我原来的问题。
现在我还有一些其他问题:
Delphi 窗体在 Windows 任务栏上显示一个按钮。到目前为止,我发现抑制任务栏按钮的唯一方法是将 Delphi 窗体创建为工具窗口(通过设置窗体的
BorderStyle := bsToolWindow
或分配WS_EX_TOOLWINDOW
表单的样式)。我需要 Delphi 表单成为普通样式表单,但我不希望显示工具栏按钮,类似于 native Delphi 或 .NET 应用程序中子表单的行为方式。我所说的 native 是指整个应用程序是用给定语言编写的。当 .NET 应用程序最小化时,Delphi 窗体不会最小化。当 .NET 应用程序的主窗体最小化时,我需要 Delphi 窗体最小化,类似于子窗体在 native Delphi 或 .NET 应用程序中的行为方式。
我不确定,但这确实像是一个所有权问题。看来 Delphi 表单并不“知道”它们是 .NET 应用程序的一部分。
所以我的基本问题是:如何让 Delphi 表单表现得像应用程序的 native 表单一样?
进一步的注意事项:我正在 Windows 7 上进行开发,但应用程序也需要在 XP 和 Vista 上表现相同。
最佳答案
我认为您的很多问题都可以通过设置 Delphi 表单的所有者来解决。
您必须通过 p/invoke 来完成此操作:
您还需要知道 Delphi 窗口的窗口句柄。
另外,我认为您可以通过其他更复杂的 p/invoke 方法删除您提到的按钮。有一些方法可以循环遍历窗口的子窗口,然后您可以将父窗口与按钮分离并销毁它。然而,这是一个相当大的黑客行为,而且很难正确执行。
关于c# - 从 .NET 4 WinForm 应用程序控制 Delphi 7 表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5262840/