精华内容
下载资源
问答
  • 使用SendMessage实现进程之间的通信 使用SendMessage实现进程之间的通信 使用SendMessage实现进程之间的通信 使用SendMessage实现进程之间的通信
  • 主要介绍了C#使用SendMessage实现进程通信的方法,涉及C#中SendMessage方法的使用技巧,非常具有实用价值,需要的朋友可以参考下
  • 1.WM_COPYDATA实现进程通信实现方式是发送WM_COPYDATA消息。发送程序:LRESULT copyDataResult; //copyDataResult has value returned by other app CWnd *pOtherWnd = CWnd::FindWindow(NULL, "卡口图片管理"); ...

    用sendmessage实现进程间通信。


    1.WM_COPYDATA实现进程间通信

    实现方式是发送WM_COPYDATA消息。

    发送程序:

    LRESULT copyDataResult;  //copyDataResult has value returned by other app 
    CWnd *pOtherWnd = CWnd::FindWindow(NULL, "卡口图片管理");
    
    CString strDataToSend = "0DAE12A3D8C9425DAAE25B3ECD16115A" ;
    if (pOtherWnd)
    {
        COPYDATASTRUCT cpd;
        cpd.dwData = 0;
        cpd.cbData = strDataToSend.GetLength()+sizeof(wchar_t);             //data length
        cpd.lpData = (void*)strDataToSend.GetBuffer(cpd.cbData); //data buffer
        copyDataResult = pOtherWnd->SendMessage(WM_COPYDATA,(WPARAM)AfxGetApp()->m_pMainWnd->GetSafeHwnd(),(LPARAM)&cpd);
        strDataToSend.ReleaseBuffer();
    }
    else 
    {
        AfxMessageBox("Unable to find other app.");
    }

    这里字符串长度为strDataToSend.GetLength()+sizeof(wchar_t),其中sizeof(wchar_t)指 \0 的长度。

    接收程序:

         接收程序先给窗口(我这里的窗口名叫“卡口图片管理”)添加WM_COPYDATA消息函数,然后在函数中添加成如下:

    BOOL CCarRecogDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
    {
        // TODO: 在此添加消息处理程序代码和/或调用默认值
    
        CString strRecievedText = (LPCSTR) (pCopyDataStruct->lpData);
        string str(strRecievedText.GetBuffer(pCopyDataStruct->cbData));
        //string str = strRecievedText.GetBuffer() ;
        printf("%s \n", str.c_str()) ;
    
        if (str == "0DAE12A3D8C9425DAAE25B3ECD16115A")
        {
            printf("正确接收 \n") ;
        }
    
        return CDialogEx::OnCopyData(pWnd, pCopyDataStruct);
    }


    运行结果:

    image


    2.win32程序和x64程序之间传递结构体

    win32程序和x64程序的指针长度是不一样的。经大神指点,结构体中的成员变量只能是基本数据类型,不能是像string这样的类,大体原因是类中有函数,函数也是一个地址(说法貌似不严谨,大概是这个意思)。

    下面在之前的基础上实现传递结构体。

    结构体定义:

    struct NOTIFY_INFO_t
    {
        char  GUID[1024];
        char  task_id[1024];
        int  index ;
    };

    收发程序中的结构体定义要一致(结构体名可以不一致,但内部需要一致)。

    主要的注意点是结构体成员变量的定义,具体的收发其实差不多。

    发送:

    void CMFCApplication1Dlg::OnBnClickedButtonSend()
    {
        // TODO: 在此添加控件通知处理程序代码
    
        LRESULT copyDataResult;  //copyDataResult has value returned by other app 
        CWnd *pOtherWnd = CWnd::FindWindow(NULL, "卡口图片管理");
    
        CString strDataToSend = "0DAE12A3D8C9425DAAE25B3ECD16115A" ;
         if (pOtherWnd)
        {
            NOTIFY_INFO_t *pNotify = new NOTIFY_INFO_t();
            memcpy(pNotify->GUID,"0DAE12A3D8C9425DAAE25B3ECD16115A",sizeof("0DAE12A3D8C9425DAAE25B3ECD16115A")) ;
    
            COPYDATASTRUCT cpd;
            cpd.dwData = 0;
            cpd.cbData = sizeof(NOTIFY_INFO_t);             //data length
            cpd.lpData = (void*)pNotify;                //data buffer
            copyDataResult = pOtherWnd->SendMessage(WM_COPYDATA,(WPARAM)AfxGetApp()->m_pMainWnd->GetSafeHwnd(),(LPARAM)&cpd);
            strDataToSend.ReleaseBuffer();
        }
        else 
        {
            AfxMessageBox("Unable to find other app.");
        }
    }

    接收:

    BOOL CCarRecogDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
    {
        // TODO: 在此添加消息处理程序代码和/或调用默认值
    
        NOTIFY_INFO_t *pNotify ;
        pNotify = (NOTIFY_INFO_t *)pCopyDataStruct->lpData ;
    
        printf("%s \n",pNotify->GUID) ;
    
        return CDialogEx::OnCopyData(pWnd, pCopyDataStruct);
    }

    运行结果:

    image

    转载于:https://www.cnblogs.com/betterwgo/p/8441452.html

    展开全文
  • 通过SendMessage来发送WM_COPYDATA消息实现进程间的通信,之所以使用SendMessage是因为SendMessage会等待消息处理过程运行完毕才返回继续执行,不会清除发送的代码。 接收端: 打开“类向导”选中“WM_COPYDATA”,...

    通过SendMessage来发送WM_COPYDATA消息实现进程间的通信,之所以使用SendMessage是因为SendMessage会等待消息处理过程运行完毕才返回继续执行,不会清除发送的代码。
    接收端:
    打开“类向导”选中“WM_COPYDATA”,添加处理程序,然后在cpp里面添加消息处理代码。
    在这里插入图片描述
    发送端:
    发送函数内部添加下面的代码
    COPYDATASTRUCT cpd;
    cpd.dwData = 0;
    cpd.cbData = strlen(ss) + 1;
    cpd.lpData = (LPVOID)ss;
    SendMessage(h1, WM_COPYDATA, 0, (LPARAM)&cpd);

    展开全文
  • 来源 visual c++开发范例,IDE:vs2010. 分为 a.server(接收消息,显示接收到的数值). b.client(打开server进程,向server主窗体发送消息). ... pWnd->SendMessage (WM_TEXTMESSAGE,this->m_nTextMessage,0); }
  • WPF应用程序使用SendMessage实现进程通信(含示例代码) 1.函数定义 使用WPF框架的C#窗体应用程序可以使用SendMessage方法实现进程通信SendMessage属于Windows API宏,可以将指定的消息发送到一个或多个窗口,...

    WPF应用程序使用SendMessage实现进程间通信(含示例代码)

    1.函数定义

           使用WPF框架的C#窗体应用程序可以使用SendMessage方法实现进程间通信,SendMessage属于Windows API宏,可以将指定的消息发送到一个或多个窗口,直到窗口程序处理完消息再返回,和PostMessage方法不同,PostMessage是将一个消息寄送到一个线程的消息队列后就立即返回。

    2.函数原型

           SendMessage的函数原型为:

    LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam)

           参数定义为:

    hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。

    Msg:指定被发送的消息。

    wParam:指定附加的消息特定信息。

    IParam:指定附加的消息特定信息。

    返回值:返回值指定消息处理的结果,依赖于所发送的消息。

    3.可能需要的引用

    using System.Diagnostics;

    using System.Runtime.InteropServices;

    using System.Threading;

     

    // 导出SendMessage函数

    [DllImport("User32.dll",EntryPoint = "SendMessage")]

    private static extern intSendMessage(IntPtr hWnd, int Msg, IntPtrwParam, ref COPYDATASTRUCTlParam);

    // 导出FindWindow函数,用于找到目标窗口所在进程

    [DllImport("User32.dll",EntryPoint = "FindWindow")]

    private static extern intFindWindow(string lpClassName, string lpWindowName);

    4.自定义消息结构体

            使用SendMessage进行进程间通信时,可以发送具有自定义结构体的消息,从而实现更多的通信功能,例如操纵程序的运行,自定义结构体的示例代码如下:

    const int WM_COPYDATA= 0x004A; // 固定数值,不可更改

     

    public struct COPYDATASTRUCT

    {

    public IntPtr dwData; // 任意值

    public int cbData;    // 指定lpData内存区域的字节数

    [MarshalAs(UnmanagedType.LPStr)]

    public string lpData; // 发送给目标窗口所在进程的数据

    }

            上述自定义结构体可以将字符串发送给目标进程。

    5.发送消息

            发送消息的程序先通过枚举进程获得目标进程句柄,然后将消息封装进自定义结构体并发送给目标进程,示例代码如下:

     

    // 待发送消息

    string s = "start";

    // 枚举进程

    Process[] procs = Process.GetProcesses();

    foreach (Process p in procs)

    {  

    if(p.ProcessName.Equals("Demo"))

    {

        // 获取目标进程句柄

    IntPtr hWnd = p.MainWindowHandle;

    // 封装消息

    byte[] sarr = System.Text.Encoding.Default.GetBytes(s);

    int len = sarr.Length;

    COPYDATASTRUCT cds2;

    cds2.dwData = (IntPtr)0;

    cds2.cbData = len + 1;

    cds2.lpData = s;

    // 发送消息

    SendMessage(hWnd, WM_COPYDATA, IntPtr.Zero, refcds2);

    }

    }

    6.接收消息

            接收消息的程序需要在MainWindow.xaml.cs文件中重写OnSourceInitialized函数,设置钩子,用于截获消息函数,示例代码如下:

    protected override void OnSourceInitialized(EventArgse)

    {

                base.OnSourceInitialized(e);

                HwndSourcehwndSource = PresentationSource.FromVisual(this) as HwndSource;

                if(hwndSource != null)

                {

                    IntPtrhandle = hwndSource.Handle;

                    hwndSource.AddHook(new HwndSourceHook(WndProc));

                }

            }

     

            用于接收消息并执行自定义行为的消息函数示例代码如下:

    IntPtr WndProc(IntPtrhwnd, int msg, IntPtrwParam, IntPtr lParam, ref bool handled)

    {

    if(msg == WM_COPYDATA)

    {

    COPYDATASTRUCT cds = (COPYDATASTRUCT)Marshal.PtrToStructure(lParam,  typeof(COPYDATASTRUCT)); // 接收封装的消息

    string rece = cds.lpData; // 获取消息内容

    // 自定义行为

    if(rece == "start")

    {

        …

    }

    }

    return hwnd;

    }

    展开全文
  • 请问下大家,共享内存和sendmessage实现进程通信有什么不同?sendmessage好像不行啊! 我现在遇到一个问题,我就想进程A向进程B告知,触发相关处理事件。我用sendmessage好像不完全行得通! A进程用socket....
  • C#中使用SendMessage进行进程通信的实例 原文: C#中使用SendMessage进行进程通信的实例 1新建解决方案SendMessageSecondExample 在解决方案下面新建两个项目:Sender和Receiver,两者的输出...
    原文: C#中使用SendMessage进行进程通信的实例

    新建解决方案SendMessageSecondExample

    在解决方案下面新建两个项目:SenderReceiver,两者的输出类型均为“Windows 应用程序”。整个程序的结构如下图所示。

     

     

    实现项目Sender

    Sender仅包含一个名为“消息发送者”的窗体,如下图所示。

     

    编写窗体后端代码,如下所示。

    using System;
    using System.Diagnostics;
    using System.Runtime.InteropServices;
    using System.Threading;
    using System.Windows.Forms;
     
    namespace Sender
    {
        public partial class frmSender : Form
        {
            [DllImport("User32.dll", EntryPoint = "SendMessage")]
            private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
     
            const int WM_KEYDOWN = 0x0100;
            const int WM_KEYUP = 0x0101;
            public frmSender()
            {
                InitializeComponent();
            }
     
            private void btnSendMsg_Click(object sender, EventArgs e)
            {
                Process[] procs = Process.GetProcesses();
                foreach (Process p in procs)
                {
                    if (p.ProcessName.Equals("Receiver"))
                    {
                        IntPtr hWnd = p.MainWindowHandle;
                        int data = Convert.ToInt32(txtMsg.Text);//未做数据校验
                        SendMessage(hWnd, WM_KEYDOWN, (IntPtr)data, (IntPtr)0);
                        Thread.Sleep(1000);
                        SendMessage(hWnd, WM_KEYUP, (IntPtr)0, (IntPtr)0);
                    }
                }
            }
        }
    }

    实现项目Receiver

    Receiver项目仅包含一个名为“消息接收者”的窗体,如下图所示。

     

    编写窗体后端代码,如下所示。

    using System.Windows.Forms;
     
    namespace Receiver
    {
        public partial class frmReceiver : Form
        {
            public frmReceiver()
            {
                InitializeComponent();
            }
     
            private void frmReceiver_KeyDown(object sender, KeyEventArgs e)
            {
                this.lsvMsgList.Items.Add(e.KeyValue.ToString());
            }
     
            private void frmReceiver_KeyUp(object sender, KeyEventArgs e)
            {
                this.lsvMsgList.Items.Add(e.KeyValue.ToString());
            }
        }
    }

    运行程序

    运行程序,效果如下图所示。

     

    从结果中了解到,“消息发送者”向“消息接收者”发送了六次消息,其中,WM_KEYDOWN消息3次,传递了数据1,2,3(为文本框中输入的数据);WM_KEYUP消息同样为三次,传递数据为0。

    附:Windows系统消息

         范围               意义

    0x0001——0x0087  主要是窗口消息

    0x00A0——0x00A9  非客户区消息

    0x0100——0x0108  键盘消息 

    0x0111——0x0126  菜单蹋消息

    0x0132——0x0138  颜色控制消息

    0x0200——0x020A  鼠标消息 

    0x0211——0x0213  菜单循环消息

    0x0220——0x0230  多文档消息 

    0x03E0——0x03E8  DDE消息

    0x0400  WM_USER 

    0x0400——0x7FFF  自定义消息

    Windows消息大全之类的可查阅:http://bbs.csdn.net/topics/70453732

     

     

    posted on 2015-11-20 23:27 NET未来之路 阅读( ...) 评论( ...) 编辑 收藏

    转载于:https://www.cnblogs.com/lonelyxmas/p/4982642.html

    展开全文
  • C#中使用SendMessage进行进程通信,可以发送字符串
  • API - FindWindow和SendMessage解决进程通信 在做一个监控项目,简单点来说就是A.exe是一个主程序,但有时不知道它会在怎样的一个状态,所以有一个B.exe来对其进行实时监控,获得各项运行状态。试了几种进程...
  • 资源包含两个源程序,里面是借用MFC的消息通信实现简单的两个进程间通信,嗯主要是通过SendMessage或PostMessage,功能实现简单便捷。
  • 常用的方法有: 使用内存映射文件 通过共享内存DLL共享内存 使用SendMessage向另一进程发送WM_COPYDATA消息 比起前两种的复杂实现来,WM_COPYDATA消息无疑是一种经济实惠的一中方法.(Z
  • 进程通信-SendMessage的使用方法用过SendMessage进行进程通信的同学都知道,这个函数一般都搭配FindWindow使用。通过FindWindow查找进程句柄,然后使用SendMessage 向这个句柄发送信息。这接口使用起来比较简单,...
  • 使用SendMessage向另一进程发送WM_COPYDATA消息 比起前两种的复杂实现来,WM_COPYDATA消息无疑是一种经济实惠的一中方法.(ZT) WM_COPYDATA消息的主要目的是允许在进程间传递只读数据。Wind
  • 如何利用SendMessage实现C#进程通信? 收藏 进程之间通讯的几种方法:在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯。常用的方法有使用内存映射文件通过共享内存DLL共享内存使用SendMessage向另一...
  • 资源包含两个源程序,里面是借用MFC的消息通信实现简单的两个进程间通信,嗯主要是通过SendMessage或PostMessage,功能实现简单便捷。该资源是我想搞点分数,分多的大佬麻烦赏赐点,没分的可以找找我另一个同样的...
  • Unicode:在Windows NT环境下以Unicode和ANSI方式实现。 PostMessage: 函数功能:该函数将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里,不等待线程处理消息就返回。消息队列里的消息通过调用...
  • 常用的方法有使用内存映射文件通过共享内存DLL共享内存使用SendMessage向另一进程发送WM_COPYDATA消息比起前两种的复杂实现来,WM_COPYDATA消息无疑是一种经济实惠的一中方法.(ZT)WM_COPYDATA消息的主要目的是允许...
  • 主要示例在C#中的SendMessage,PostMessage,包含两个示例,一个资料文档,希望受用。 在C#中 API 消息处理 SendMessage PostMessage 进程通信 发消息 实例 文档资料
  • 进程通信SendMessage - C#, WM_SETTEXT, WM_GETTEXT
  • 进程通信SendMessage - VB.NET, WM_SETTEXT, WM_GETTEXT
  • 使用SendMessage进程clt发送数据到进程srv,期中clt是基于对话框的MFC进程,srv是基于单文档的进程 clt中发送数据的代码 CWnd *pWnd = CWnd::FindWindow(NULL,L"无标题 - Srv"); LRESULT copyDataResult; ...
  • 进程通信-SendMessage的使用方法 用过SendMessage进行进程通信的同学都知道,这个函数一般都搭配FindWindow使用。通过FindWindow查找进程句柄,然后使用SendMessage 向这个句柄发送信息。这接口使用起来比较简单,...
  • [DllImport("User32.dll", EntryPoint = "SendMessage")] private static extern int SendMessage(int hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam); [DllImport("User32.dll", EntryPoint = ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,119
精华内容 5,647
关键字:

sendmessage实现进程通信