C#自定义结构体的(用SendMessage)传递

要传递结构体

public struct STUDENT
    {
        public int id;                //ID
        public string name;      //姓名
    }    

要引用Win32api函数FindWindow,SendMessage

 /// <summary>
        /// 查找窗体句柄
        /// </summary>
        /// <param name="lpClassName">指定的类名</param>
        /// <param name="lpWindowName">指定的窗口名称</param>
        /// <returns>返回窗口句柄</returns>
        [DllImport("User32.dll", EntryPoint = "FindWindow")]
        public  static extern IntPtr FindWindow(
            string lpClassName,
            string lpWindowName);

        /// <summary>
        /// 查找窗体句柄
        /// </summary>
        /// <param name="hwndParent">父窗口句柄</param>
        /// <param name="hwndChildAfter">子窗口句柄</param>
        /// <param name="lpClassName">窗口类名</param>
        /// <param name="lpWindowName">窗口名称</param>
        /// <returns></returns>
        [DllImport("User32.dll", EntryPoint = "FindWindowEx")]
        public static extern IntPtr FindWindowEx(
            IntPtr hwndParent,
            IntPtr hwndChildAfter, 
            string lpClassName,
            string lpWindowName);


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

        public static extern int SendMessage(
            IntPtr hWnd,    // 窗口句柄
            int Msg,     // message
            int wParam,    // first message parameter
            IntPtr lParam);      // second message parameter

3,还要定义个消息

public const int WM_COPYDATA = 0X004A;

 也可以发送自定义消息   public const int WM_USER = 1024;        //自定义消息

4,发送消息

//先查找要发送的窗口句柄
IntPtr nRet = Win32API.FindWindowEx(IntPtr.Zero, IntPtr.Zero,null , "Form2");
            if (nRet == IntPtr.Zero)
                MessageBox.Show("没有找到指定的窗口");

STUDENT stu = new STUDENT();
            stu.id = 101;
            stu.name = "我是发送者";
            IntPtr stuPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(STUDENT)));
            Marshal.StructureToPtr(stu, stuPtr, false);

            SendMessage(nRet, WM_COPYDATA, 0, stuPtr);
      //用PostMessage发送消息
      //PostMessage(nRet, WM_USER, 0, stuPtr);

 

 

5,在接收窗口中重写DefWndProc函数

 

public const int WM_COPYDATA = 0X004A;
public const int WM_USER = 1024;        //自定义消息
protected override void DefWndProc(ref Message m) { if(m.Msg==WM_COPYDATA) { STUDENT stu = (STUDENT)Marshal.PtrToStructure(m.LParam, typeof(STUDENT)); textBox1.Text = stu.name;
          return; }         

if(m.Msg==WM_USER)
{
  STUDENT stu = (STUDENT)Marshal.PtrToStructure(m.LParam, typeof(STUDENT));
  textBox1.Text = stu.name;
  return;
}

            base.DefWndProc(ref m);
        }

 6,在接收窗口也要定义WM_COPYDATA消息,和结构体,

 

 

7,在WM_COPYDATA传递COPYDATASTRUCT结构体也是可行的

IntPtr cdsPtr = IntPtr.Zero;
cdsPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(COPYDATASTRUCT)));
Marshal.StructureToPtr(cds, cdsPtr, false);

SendMessage(nRet, WM_COPYDATA, 0, cdsPtr);

 

接收窗口中

COPYDATASTRUCT cds = (COPYDATASTRUCT)Marshal.PtrToStructure(m.LParam, typeof(COPYDATASTRUCT));
textBox1.Text = cds.lpData;

 

注意:要用Marshal类要加命名空间 using System.Runtime.InteropServices;

 

今天就弄到这了,其他的API以后有时间再弄

posted @ 2021-04-15 10:13  初吻给了烟灬  阅读(1103)  评论(0编辑  收藏  举报