代码人生的小狗窝

一行行枯燥的代码,却描绘出人生的点点滴滴

您现在的位置是:首页>_C#

sendmessage引发其他异常!(顶又分)

发布时间:2019-08-20浏览(437)

    sendmessage引发其他错误!(顶又分)
    各位老大:我使用sendmessage从一个程序集中发送消息到主程序的窗体。

    消息定义:
    C# code
        
    public static class MyMessage
        {
            public const int USER_MESSAGE = 0x0400;
            public const int WM_OPEN_ATTRIBUTE = USER_MESSAGE + 1;
            public const int WM_CLOSE_ATTRIBUTE = USER_MESSAGE + 2;
    
        }
    
    


    C# code
    
     public static class MessageController
        {
            [DllImport("User32.dll", EntryPoint = "SendMessage")]
    
            private static extern int SendMessage(
                 int hWnd, // handle to destination window 
                 int Msg, // message 
                 IntPtr wParam, // first message parameter 
                 IntPtr lParam // second message parameter 
                );
    
            [DllImport("User32.dll", EntryPoint = "FindWindow")]
            private static extern int FindWindow(string lpClassName, string lpWindowName);
    
            public static void SendMsgToMainForm(int MSG, IntPtr wParam, IntPtr lParam)
            {
                int WINDOW_HANDLER = FindWindow(null, @"mainform");
                if (WINDOW_HANDLER == 0)
                {
                    throw new Exception("Could not find Main window!");
                }
    
                SendMessage(WINDOW_HANDLER, MSG, wParam, lParam);
            }
    
        }
    
    


    调用:
    C# code
    
    MessageController.SendMsgToMainForm(MyMessage.WM_OPEN_ATTRIBUTE, (IntPtr)0, (IntPtr)0);
    
    



    接受消息:
    C# code
    
            protected override void DefWndProc(ref System.Windows.Forms.Message m)
            {
                switch (m.Msg)
                {
                    case MyMessage.WM_OPEN_ATTRIBUTE: //处理消息
                           //...
                        break;
                    case MyMessage.WM_CLOSE_ATTRIBUTE:
                       //...
                        break;
                    default:
                        base.DefWndProc(ref m);//调用基类函数处理非自定义消息。
                        break;
                }
            }
    
    

    结果出现一些异常:
    1.有的时候回收不到消息
    2.在程序中使用到的一个com组件会报错!

    总之用之前没有问题,用之后就出现了上面的问题。

    各位有没有好的经验指点以下啊!!!

    ------解决方案--------------------
    报什么错?DefWndProc里面写些调试信息看看,到底有没有接收
    ------解决方案--------------------

    ------解决方案--------------------
    探讨


    ------解决方案--------------------
    SendMessage的重载版本很多,你确认你的参数类型正确么?
    ------解决方案--------------------

    //发送COPYDATA类型的 
    const int WM_COPYDATA = 0x004A;

    [DllImport("User32.dll", EntryPoint = "SendMessage")]
    private static extern int SendMessage(
    IntPtr hWnd, // handle to destination window
    int Msg, // message
    int wParam, // first message parameter
    ref COPYDATASTRUCT lParam // second message parameter
    );

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


    IntPtr hwnd_win;
    IntPtr hwnd_textbox;

    hwnd_win = FindWindow(null, "Form4");