发送端 已经有C# winform实现,方法是这样的,现在的问题就是如何用delphi 去接受C#发送的这个消息 1.引入User32.dll的两个函数 SendMessage,和FindWindow代码如下:[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(
int hWnd, // handle to destination window
int Msg, // message
int wParam, // first message parameter
ref COPYDATASTRUCT lParam // second message parameter
); [DllImport("User32.dll", EntryPoint = "FindWindow")]
private static extern int FindWindow(
string lpClassName,
string lpWindowName
);
2.构造消息结构
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
3.发送,其中WM_COPYDATA 的值是 const int WM_COPYDATA = 0x004A
private void btnSend_Click(object sender, EventArgs e)
{
int WINDOW_HANDLER = FindWindow(null, @"第三方应用");
if (WINDOW_HANDLER == 0)
{
}
else
{
byte[] sarr = System.Text.Encoding.Default.GetBytes(this.textBoxSend.Text);
int len = sarr.Length;
COPYDATASTRUCT cds;
cds.dwData = (IntPtr)1;
cds.lpData = this.textBoxSend.Text;
cds.cbData = len + 1;
SendMessage(WINDOW_HANDLER, WM_COPYDATA, 0, ref cds);
}
private static extern int SendMessage(
int hWnd, // handle to destination window
int Msg, // message
int wParam, // first message parameter
ref COPYDATASTRUCT lParam // second message parameter
); [DllImport("User32.dll", EntryPoint = "FindWindow")]
private static extern int FindWindow(
string lpClassName,
string lpWindowName
);
2.构造消息结构
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
3.发送,其中WM_COPYDATA 的值是 const int WM_COPYDATA = 0x004A
private void btnSend_Click(object sender, EventArgs e)
{
int WINDOW_HANDLER = FindWindow(null, @"第三方应用");
if (WINDOW_HANDLER == 0)
{
}
else
{
byte[] sarr = System.Text.Encoding.Default.GetBytes(this.textBoxSend.Text);
int len = sarr.Length;
COPYDATASTRUCT cds;
cds.dwData = (IntPtr)1;
cds.lpData = this.textBoxSend.Text;
cds.cbData = len + 1;
SendMessage(WINDOW_HANDLER, WM_COPYDATA, 0, ref cds);
}
解决方案 »
- 来帮小弟个忙
- 如何通过得到点击控件得到控件名来执行其相应对的自己的代码?
- 关于Ctrl_V操作键的消息?
- 大家帮我填一下这段程序~~~~~
- 请问:要如何在窗体上加一个按钮,实现关闭计算机!在线等
- rave 相关设置的问题?如果要制作安装文件,rave中的哪些属性要作相应的设置?
- 请教如何让程序自带字库?
- 请教高手:关于报表显示的问题
- 请问一个很菜的问题我是初学者啊,我在为一个数据库添加一个字段时用的方法是右击fields editor,然后选new fields,起了字段名和字段类型
- 轻松一分钟,统计一下看流星雨的程序员们是单身还是成双成对?
- pagecontrol form 的show问题?????
- 关于ThreadedTimer,求助大家!
以下供你参考,我发送方也是delphi的,procedure WMCopyData(var Msg: TMessage); message WM_COPYDATA;procedure TForm1.WMCopyData(var Msg: TMessage);
var
str : string;
Data : ^tagCOPYDATASTRUCT;
begin
Data:= Pointer(Msg.lParam);
str:= StrPas(Data.lpData); //接收一个字符串
ShowMessage(str);
end;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
procedure Button1Click(Sender: TObject); private
{ Private declarations }
public
procedure MyCopyDataMsg(Var Msg : TMessage); Message WM_COPYDATA;
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
cdds : TCopyDataStruct;
begin cdds.dwData := 0;
cdds.cbData := length(Edit1.Text)+1;
cdds.lpData := pchar(Edit1.Text);
SendMessage(Handle,WM_COPYDATA,0,LongWord(@cdds));end;
procedure TForm1.MyCopyDataMsg(var Msg: TMessage);
var
cdds : TcopyDataStruct;
begin
if msg.Msg = WM_COPYDATA then
begin
cdds := PcopyDataStruct(Msg.LParam)^;
edit2.Text := (Pchar(cdds.lpData));
end;
end;end.
procedure TForm1.Button1Click(Sender: TObject);
var
cdds : TCopyDataStruct;
begin cdds.dwData := 0;
cdds.cbData := length(Edit1.Text)+1;
cdds.lpData := pchar(Edit1.Text);
SendMessage(Handle,WM_COPYDATA,0,LongWord(@cdds));end; 就OK