c# - 从 .NET 4 WinForm 应用程序控制 Delphi 7 表单

标签 c# .net delphi interop

我有一个 .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/

相关文章:

网格内的 .NET MAUI CollectionView 在 iPhone/iPad 上未正确显示

multithreading - 如何发送字符串(串口),等待(超时)并捕获回复字符串?

c# - 使用 LINQ 计算嵌套的导航表行

c# - 添加 UWP 后台任务导致 AppManifest 错误

c# - 如何将工程师编号恢复为日期时间?

德尔福的OTA : is there a way to get active configuration while building (D2010)?

google-chrome - 对新应用程序进行代码签名,Windows和chrome会认为它安全吗?

c# - Entity Framework Core 导航属性不会保持为空

c# - 获取 Netezza 查询结果

c# - 将 VS 2008 (c#) 解决方案转换为 VS 2010 后出现错误/警告