已经找到窗体的句柄,怎么向这个窗体发送消息呀? (windows api实现)
假设句柄是a

解决方案 »

  1.   

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
    static extern IntPtr SendMessage(HandleRef hWnd, uint Msg, IntPtr wParam, IntPtr lParam);hWnd 就是 句柄
    Msg 是 消息编码;
    wParam和lParam是消息附加参数,得看你的消息而定
      

  2.   

    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    [DllImport("user32.dll", EntryPoint="SendMessageA")] 
    public static extern int SendMessage (IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam); 
    在一个button_Click事件中写
    IntPtr Handle = FindWindow("Notepad", null);
    SendMessage(Handle, 16, IntPtr.Zero, IntPtr.Zero);你打开个记事本,看看能不能关闭啊?
    Handle就是你打开的记事本的句柄
    16就是WM_CLOSE消息的值
      

  3.   

    在窗体需要重载方法,参考一下吧:
     /// <summary>
            /// 
            /// </summary>
            /// <param name="m"></param>
            protected override void DefWndProc(ref System.Windows.Forms.Message m)
            {
                string message;
                SendDataStruct myData;//
                Type mytype;
                switch (m.Msg)
                {
                    case MessageType.WM_TEST://处理消息                    myData = new SendDataStruct();//这是创建自定义信息的结构
                        mytype = myData.GetType();
                        myData = (SendDataStruct)m.GetLParam(mytype);//这里获取的就是作为LParam参数发送来的信息的结构
                        MessageBox.Show(myData.lpData); //显示收到的自定义信息
                        break;
                    case MessageType.WM_MSG:
                        myData = new SendDataStruct();//这是创建自定义信息的结构
                        mytype = myData.GetType();
                        myData = (SendDataStruct)m.GetLParam(mytype);//这里获取的就是作为LParam参数发送来的信息的结构
                        ShowMsgInRichTextBox(myData.lpData);//显示收到的自定义信息
                        break;
                    default:
                        base.DefWndProc(ref m);//调用基类函数处理非自定义消息。
                        break;
                }
                
            }
    下边是自己定义的类:
    public class MessageType
        {
            public const int USER = 0x0400;
            //as mfc Define WM_TEST WM_USER + 101
            public const int WM_TEST = USER + 101;
            public const int WM_MSG = USER + 102;
        }
        //要发信息数据结构,作为SendMessage函数的LParam参数    public struct SendDataStruct
        {
            public IntPtr dwData;       //附加一些个人自定义标志信息,自己喜欢
            public int DataNo;      //信息号
            public int DataLength; //信息长度
            [MarshalAs(UnmanagedType.LPStr)]
            public string lpMsg;
            public string lpData;       //要发送的信息
        }
        class MSG
        {
           
            ////申明发送消息函数
            //[DllImport("User32.dll", EntryPoint = "SendMessage")]
            //private static extern int SendMessage(
            //    IntPtr hWnd,      // handle to destination window
            //    uint Msg,         // message
            //    uint wParam,      // first message parameter
            // //   uint lParam       // second message parameter
            //    string dd
            //    );
            //消息发送API        [DllImport("User32.dll", EntryPoint = "SendMessage")]        private static extern int SendMessage(
                                                    IntPtr hWnd,        // 信息发住的窗口的句柄
                                                    int Msg,            // 消息ID
                                                    int wParam,         // 参数1
                                                    ref SendDataStruct lParam // 参数2   [MarshalAs(UnmanagedType.LPTStr)]StringBuilder lParam
                                                    );
            
            //申明DLL中启动消息函数
            [DllImport("MessageDLL.dll", EntryPoint = "StartSendMessage")]
            private extern static void StartSendMessage(IntPtr hWnd);
            private IntPtr m_Wnd;
            public MSG(IntPtr hWnd)
            {
                m_Wnd = hWnd;
            }
            public void SendMsg(string lpstr)
            {
                byte[] myInfo = System.Text.Encoding.Default.GetBytes(lpstr);            int len = myInfo.Length;            SendDataStruct myData = new SendDataStruct();            myData.dwData = (IntPtr)100;            myData.lpData = lpstr;
               // myData.lpMsg = lpmsg;
                myData.DataLength = len + 1;
                SendMessage(this.m_Wnd, MessageType.WM_MSG, 100, ref myData);        }
            public  void  SendMsg(string lpstr,string lpmsg)
            {
                byte[] myInfo = System.Text.Encoding.Default.GetBytes(lpstr);            int len = myInfo.Length;            SendDataStruct myData=new SendDataStruct ();            myData.dwData = (IntPtr)100;            myData.lpData = lpstr;
                myData .lpMsg =lpmsg ;
                myData.DataLength = len + 1;
                SendMessage(this.m_Wnd, MessageType.WM_MSG, 100, ref myData);        }
      

  4.   


    你这样用当然是不对的,连 Handle是否有效都不判断