WinForm 跨进程传输数据

public class WinMessageHelper
{
    
private struct COPYDATASTRUCT
    {
        
public IntPtr dwData;
        
public int cbData;
        [MarshalAs(UnmanagedType.LPStr)]
        
public string lpData;
    }

    
//使用COPYDATA进行跨进程通信
    public const int WM_COPYDATA = 0x004A;

    [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);

    
/// <summary>
    
/// 发送消息
    
/// </summary>
    
/// <param name="windowReceiveTitle">接收方窗体标题名称</param>
    
/// <param name="strData">要发送的数据</param>
    public static void Send(string windowReceiveTitle, string strData)
    {
        
int winHandler = FindWindow(null,windowReceiveTitle);
        
if (winHandler != 0)
        {
            
byte[] sarr = System.Text.Encoding.Default.GetBytes(strData);
            
int len = sarr.Length + 1;
            COPYDATASTRUCT cds;
            cds.dwData 
= (IntPtr)100;
            cds.lpData 
= strData;
            cds.cbData 
= len;
            SendMessage(winHandler, WM_COPYDATA, 
0ref cds);
        }
    }

    
/// <summary>
    
/// 接收消息
    
/// </summary>
    
/// <example>
    
/// 在窗体中覆盖接收消息函数
    
/// protected override void DefWndProc(ref System.Windows.Forms.Message m)
    
/// {
    
///     switch(m.Msg)
    
///     {
    
///         case WinMessageHelper.WM_COPYDATA:
    
///             string str = WinMessageHelper.Receive(ref m);
    
///             break;
    
///         default:
    
///             base.DefWndProc(ref m);
    
///             break;
    
/// 
    
///     }
    
/// }
    
/// </example>
    
/// <returns>接收的到数据</returns>
    public static string Receive(ref System.Windows.Forms.Message m)
    {
        COPYDATASTRUCT cds 
= new COPYDATASTRUCT();
        Type cdsType 
= cds.GetType();
        cds 
= (COPYDATASTRUCT)m.GetLParam(cdsType);
        
return cds.lpData;
    }
}


原文:http://www.cnblogs.com/yuji/archive/2011/07/18/2109138.html 

posted @   把爱延续  阅读(957)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示