如何将delphi表单作为参数传递给c#中创建的dll函数。我想将表单作为参数传递给函数。 错误是: 不兼容的类型:'类参考'和' _Form'
c#code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace s3
{
//g1b572e8-7888-47e4-98t1-fe0e15855r32
[Guid("e1b572e8-7888-47e4-98e1-fe0e15855f49"),InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[ComVisible(true)]
public interface setmonitorwindow
{
void Concatenate([MarshalAs(UnmanagedType.LPWStr)] Form f1);
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Form1 f2 = this;
Class1 c1 = new Class1();
c1.Concatenate(f2);
}
}
[Guid("76663fdc-8bb8-4e68-82j5-a110aa3c0uf2"),ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public class Class1 : setmonitorwindow
{
[return: MarshalAs(UnmanagedType.SysInt)]
public void Concatenate([MarshalAs(UnmanagedType.LPWStr)] Form f1) //this function i wan call
{
var screen1 = Screen.FromPoint(Cursor.Position);
f1.StartPosition = FormStartPosition.Manual;
f1.Left = screen1.Bounds.Left + screen1.Bounds.Width / 2 - f1.Width / 2;
f1.Top = screen1.Bounds.Top + screen1.Bounds.Height / 2 - f1.Height / 2;
}
}
}
delphi代码:
begin
objsetmonitor := CoClass1.Create;
objsetmonitor.Concatenate(TForm1);
Form2.Show;
end;
我也按照DavidHeffernan Sir的说明尝试了其他方式如下:
我实现以下代码:
Function MonitorFromWindow(hwnd: HWND;dwFlags:DWORD):HWND; stdcall; external 'User32.dll';
procedure TForm2.Button1Click(Sender: TObject);
begin
result:=MonitorFromWindow(Form3.Handle,MONITOR_DEFAULTTONEAREST);
Form3.Show;
end;
但现在MONITOR_DEFAULTTONEAREST是delphi 5中未声明的标识符如何声明它。还请告诉我,我正在走向正确的方向吗?
答案 0 :(得分:1)
Delphi 表单是 Delphi类的实例,而不是 .NET框架类。因此,任何C#代码都无法使用任何此类表单引用。
但是,您要实现的目标不需要表单对象,只需要表单所代表的桌面窗口的窗口句柄。
重写您的C#代码以接受 HWND 并将Form.WindowHandle
传递给C#。然后,您可能需要使用interop来调用相应的Win32 API函数来处理该窗口句柄。
话虽如此,你想要实现的东西在Delphi应用程序本身应该是直截了当的,不需要任何外部代码,更不用说C#了。唯一的复杂因素是您的Delphi版本( Delphi 5 )不直接支持 MonitorFromPoint()方法。
实现一个并不是特别困难,但如果你在C#空间中感觉更舒服,那么这可能是继续沿着当前路径前进的原因(但使用 HWND ),除非你能得到帮助在Delphi中实现所需的代码。