日期:2014-05-18  浏览次数:21027 次

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