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. asm磁盘组,asm磁盘状态学习

    说明:在数据库中巡检,发现,数据库某个磁盘组状态为mount,其余磁盘组均为CONNECTED状态,排除是否异常 文档流程: 1.实际环境查询校验 2.官方文档视图中对磁盘组,磁盘状态的解释说明 3. ...

  2. Codeforces 893A:Chess For Three(模拟)

    题目链接:http://codeforces.com/problemset/problem/893/A 题意 Alex,Bob,Carl三人下棋,每次只能两个人进行下棋,要求输的那个人当旁观者,然后给 ...

  3. 《DSP using MATLAB》Problem 6.8

    代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...

  4. Javascript中的 “&” 和 “|” 详解

    转自:https://www.jb51.net/article/104394.htm 一.前言: 在文章开始之前,先出几个题目给大家看看: var num1 = 1 & 0; console. ...

  5. doubleclick-video-skipable

    from:https://support.google.com/adxbuyer/answer/2691733?hl=en Implement skippable functionality usin ...

  6. python 基础的用法新发现

    引用的发现: # 引用的处理 因为变量指的是某一内存地址 引用变量实际是引用一个固定的内存地址,# 当这个变量中的内容变了之后,他的内存地址不变, 所以引用者也动态的得到了变化的变量l1=[1,2,3 ...

  7. Load Balancing OpenSSH SFTP with HAProxy

    In my previous post I described how we setup a Ubuntu Server (12.0.4) as an OpenSSH SFTP server. In ...

  8. Gravitee.io Access Management 组件

    Access Management组件在Gravitee.io 主要是进行认证以及权鉴的处理,支持oauth2 以及openid connect 等协议,同时好多功能已经集成在ui 管理界面上了,还是 ...

  9. 10 Rules of Highly Successful Project Management

    I commited the information below to report PDU of PMI. ^_^. In this paper, the author introduces his ...

  10. Using C++11 function & bind

    The example of callback in C++11 is shown below. #include <functional> void MyFunc1(int val1, ...