Winform to Winfrom==>

发送端==》

using System;
using System.Runtime.InteropServices; namespace CopyData.Sender
{
public partial class Form1 : System.Windows.Forms.Form
{
const int WM_COPYDATA = 0x004A;
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
} public Form1()
{
InitializeComponent();
} [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); private void button1_Click(object sender, System.EventArgs e)
{
int WINDOW_HANDLER = FindWindow(null, @"Form1");
if (WINDOW_HANDLER == 0)
{
}
else
{
byte[] sarr = System.Text.Encoding.Default.GetBytes(this.textBox1.Text);
int len = sarr.Length;
COPYDATASTRUCT cds;
cds.dwData = (IntPtr)100;
cds.lpData = this.textBox1.Text;
cds.cbData = len + 1;
SendMessage(WINDOW_HANDLER, WM_COPYDATA, 0, ref cds);
}
}
}
}

接收端==》

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms; namespace CopyData.Receiver
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} const int WM_COPYDATA = 0x004A;
//[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
} protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
switch (m.Msg)
{
//接收自定义消息 USER,并显示其参数
case WM_COPYDATA:
COPYDATASTRUCT mystr = new COPYDATASTRUCT();
Type mytype = mystr.GetType(); mystr = (COPYDATASTRUCT)m.GetLParam(mytype);
this.textBox1.Text = mystr.lpData; break;
default:
base.DefWndProc(ref m);
break;
}
}
} }

运行效果如下:

注意:

int WINDOW_HANDLER = FindWindow(null@"Form1"); —— 用于确定发送方发送数据到其他进程的某个标题为Form1的窗体。

2.delhpi程序与C#程序进行消息发送时,出现如下问题,解决思路?

a.安装.netframework

b.检查delphi以及C#程序(例如,delphi==>cdds.cbData := length(Edit1.Text)+1;cdds.lpData := pchar(Edit1.Text);)是否正确?

WPF to Winfrom to WPF==>

发送方: WPF to WinFrom

private void QueueCode(int queueType)
{
IntPtr hwnd = ((HwndSource)PresentationSource.FromVisual(this)).Handle;
int sendHandle = hwnd.ToInt32();
int WINDOW_HANDLER = FindWindow(null, @"Form1");
if (WINDOW_HANDLER == )
{
StartQueueExe();
WINDOW_HANDLER = FindWindow(null, @"Form1");
} string queueName = this.cbQueue.Text;
queueName = queueType + "^" + this.cbQueue.Text + "^" + sendHandle;
if (WINDOW_HANDLER == ) { }
else
{
byte[] sarr = System.Text.Encoding.Default.GetBytes(queueName);
int len = sarr.Length;
COPYDATASTRUCT cds;
cds.dwData = (IntPtr);
cds.lpData = queueName;
cds.cbData = len + ;
SendMessage(WINDOW_HANDLER, WM_COPYDATA, , ref cds);
} var hwndSource = (HwndSource)HwndSource.FromVisual(this);
hwndSource.AddHook(new HwndSourceHook(WndProc));
} private void StartQueueExe()
{
string filePath = AppDomain.CurrentDomain.BaseDirectory + "TEST.exe";
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = filePath;
p.StartInfo.UseShellExecute = false; //是否使用操作系统shell启动
p.StartInfo.RedirectStandardInput = true;//接受来自调用程序的输入信息
p.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息
p.StartInfo.RedirectStandardError = true;//重定向标准错误输出
p.StartInfo.CreateNoWindow = true;//不显示程序窗口
p.Start();//启动程序
Thread.Sleep();
} private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
switch (msg)
{
case WM_COPYDATA:
COPYDATASTRUCT mystr = new COPYDATASTRUCT();
Type mytype = mystr.GetType();
COPYDATASTRUCT cds = (COPYDATASTRUCT)Marshal
.PtrToStructure(lParam, typeof(COPYDATASTRUCT));
this.lblQueueMessage.Content = cds.lpData;
break;
default: break;
}
return (System.IntPtr);
}

接收方:WinFrom获取

  #region 获取消息
/// <summary>
/// 0x004A
/// </summary>
const int WM_COPYDATA = 0x004A;
//[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
} protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
try
{
switch (m.Msg)
{
// 接收自定义消息 USER,并显示其参数
case WM_COPYDATA:
COPYDATASTRUCT mystr = new COPYDATASTRUCT();
Type mytype = mystr.GetType();
mystr = (COPYDATASTRUCT)m.GetLParam(mytype);
ReceiveMessage = mystr.lpData;
break;
default:
base.DefWndProc(ref m);
break;
}
}
catch { return; }
} #endregion

Winfrom to WPF

   private static string FormTitle = "Form1";
[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); public bool SendMessage(int value, int queueType)
{
try
{
StringBuilder content = new StringBuilder();
if (value != 0)//没有全部被预约
{
// string appointTimes = DateTime.Now.ToLongTimeString().ToString();
if (string.IsNullOrEmpty(CurrentDate)) CurrentDate = DateTime.Now.ToShortDateString();
int num = DBQSQueueBusiness.GetCountByCondition(QueueId, CurrentDate); CurrentDate = DateTime.Parse(CurrentDate).ToString("yyyy-MM-dd");
content.Append(CurrentDate);//日期
content.Append("^");
content.Append(CurrentTimePart);//描述appointTimes
content.Append("^");
content.Append(value);//号
content.Append("^");
content.Append(QueueId);//队列
content.Append("^"); if (queue == null) queue = new V_Queue();
queue.ENROLDATE = CurrentDate;
queue.APPOINTTIME = CurrentTimePart;//appointTimes
queue.SORTNO = value;
}
else content.Append("0"); //int WINDOW_HANDLER = FindWindow(null, @FormTitle);
int WINDOW_HANDLER = int.Parse(FormTitle);
if (WINDOW_HANDLER == 0) { }
else
{
byte[] sarr = System.Text.Encoding.Default.GetBytes(content.ToString());
int len = sarr.Length;
COPYDATASTRUCT cds;
cds.dwData = (IntPtr)100;
cds.lpData = content.ToString();
cds.cbData = len + 1;
SendMessage(WINDOW_HANDLER, WM_COPYDATA, 0, ref cds);
}
}
catch { return false; }
return true;
}

WPF 接收方:

 #region 定义常量消息值
public const int WM_GETTEXT = 0x0D;
public const int WM_SETTEXT = 0x0C;
public const int WM_SIZEING = 0x0214;
public const int WM_COPYDATA = 0x004A;
public const int WM_LBUTTONDBLCLK = 0x0203;
#endregion #region 定义结构体
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
#endregion private void Window_Loaded(object sender, RoutedEventArgs e)
{
HwndSource hWndSource;
WindowInteropHelper wih = new WindowInteropHelper(this);
hWndSource = HwndSource.FromHwnd(wih.Handle);
//添加处理程序
hWndSource.AddHook(Test);
}
private IntPtr Test(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
switch (msg)
{ case WM_COPYDATA:
{ COPYDATASTRUCT mystr = new COPYDATASTRUCT();
Type mytype = mystr.GetType(); COPYDATASTRUCT MyKeyboardHookStruct = (COPYDATASTRUCT)Marshal.PtrToStructure(lParam, typeof(COPYDATASTRUCT));
this.textbox.Text = MyKeyboardHookStruct.lpData;
break; }
default:
{
break;
} }
return IntPtr.Zero;
}

  

使用copydata实现进程之间数据传递的更多相关文章

  1. c#进程之间对象传递方法

    1. 起源 KV项目下载底层重构升级决定采用独立进程进行Media下载处理,以能做到模块复用之目的,因此涉及到了独立进程间的数据传递问题. 目前进程间数据传递,多用WM_COPYDATA.共享dll. ...

  2. Android 在不同Actitity之间数据传递

    本文实现一个简易的人品计算器来实践在不同Actitity之间数据传递 intent的数据传递 从A界面打开B界面 把A界面的数据传递给B界面 1. intent.setData(uri) -- int ...

  3. 无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)

    1.smartimageview使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&q ...

  4. 解析activity之间数据传递方法的详解

    转自:http://www.jb51.net/article/37227.htm 本篇文章是对activity之间数据传递的方法进行了详细的分析介绍,需要的朋友参考下     1  基于消息的通信机制 ...

  5. PCB MVC启动顺序与各层之间数据传递对象关系

    准备着手基于MVC模式写一套Web端流程指示查看,先着手开发WebAPI打通数据接口,后续可扩展手机端 这里将MVC基本关系整理如下: 一.MVC启动顺序 二.MVC各层之间数据传递对象关系

  6. python之 《进程之间数据交互和进程池》

    1.进程q 进程呢就相当于一个房子,线程就相当于是房子里面在工作的人,那么一个房子的空间对于房子里面的人来说是共享的, 现在是多进程,也就是说有许多房子,很显然这个房子的空间只属于这个房子,不会属于其 ...

  7. Android——不同activity之间数据传递

    /* * 不同activity之间数据的传递 */ public class MainActivity extends Activity { private EditText et_name; @Ov ...

  8. 转-Activity之间数据传递之Intent数据传递

    Intent意图 可用于Activity之间的数据传递,一般可分为下面两种情况,从当前Activity传递到目标Activity后有无返回值: 1.传递后无返回值的情况: 1 2 3 4 5 6 7 ...

  9. android Activity之间数据传递 Parcelable和Serializable接口的使用

    Activity之间传数据时,为了避免麻烦,往往会将一些值封装成对象,然后将整个对象传递过去.传对象的时候有两种情况,一种是实现Parcelable接口,一种是实现Serializable接口.0.解 ...

随机推荐

  1. java的异常抛出和String类常用方法

    一.异常抛出 异常是程序的异种非错误的意外情况,分为运行期异常(RuntimeException)和编译期异常(CheckedExcption) 处理异常可以用try——catch或自定义 impor ...

  2. 2.12 单选框和复选框(radiobox、checkbox)

    2.12 单选框和复选框(radiobox.checkbox) 本篇主要介绍单选框和复选框的操作一.认识单选框和复选框    1.先认清楚单选框和复选框长什么样 2.各位小伙伴看清楚哦,上面的单选框是 ...

  3. PHP设计模式之观察者模式(转)

    开篇还是从名字说起,“观察者模式”的观察者三个字信息量很大.玩过很多网络游戏的童鞋们应该知道,即便是斗地主,除了玩家,还有一个角色叫“观察者".在我们今天他谈论的模式设计中,观察者也是如此. ...

  4. ssh和ejb的区别

    转自:https://zhidao.baidu.com/question/137154342.html SSH(Struts,Spring,Hibernate) Struts进行流程控制,Spring ...

  5. Android Studio安卓导出aar包与Unity 3D交互

    Unity与安卓aar 包交互 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...

  6. python 中os的常用方法

    1.更改当前的路径 import os os.chdir( "D:/java") 注意python中表示文件路径,文件夹之间用/或者\\不能使用\

  7. C语言--第四周作业评分和总结(5班)

    作业链接:https://edu.cnblogs.com/campus/hljkj/CS2017-5/homework/1129 一.评分要求 要求1 完成PTA第四周所有题(20分). 要求2 4道 ...

  8. 为移动端而设计的bootstrap的使用

    一.下载 --bs ---css ----bootstrap.css ----bootstrap.min.css ---fonts ---js ----bootstrap.js ----jquery. ...

  9. 【带权并查集】【HDOJ】

    http://acm.hdu.edu.cn/showproblem.php?pid=3047 Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others)   ...

  10. Ubuntu下安装JDK图文教程详解 jdk-java6-30 .bin 的处理方法

    Ubuntu下安装JDK图文教程详解 jdk-java6-30 .bin 的处理方法: https://blog.csdn.net/mingjie1212/article/details/485250 ...