读书人

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

发布时间: 2012-02-04 15:43:08 作者: rapoo

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



COPYDATASTRUCT cds;
cds.dwData = (IntPtr)100;
cds.lpData = "Test Message";
cds.cbData = 14;

SendMessage(hwnd_win, WM_COPYDATA, 0, ref cds);




[解决办法]
接受//
今天上午刚好无聊想做一个wince的sendmessage
可惜wince版本的sdk不支持c++的到时没问题
这个代码是c#写的。
你的sendmessage的参数不对。是0当然受到了,它认为是空,所以能发消息
const int WM_COPYDATA = 0x004A;
protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
switch (m.Msg)
{
case WM_COPYDATA:
COPYDATASTRUCT mystr = new COPYDATASTRUCT();
Type mytype = mystr.GetType();
mystr = (COPYDATASTRUCT)m.GetLParam(mytype);

break;
default:
base.DefWndProc(ref m);
break;

}

}

[解决办法]
顶把,,,是不是消息常数定义的有问题,被别的占用了

读书人网 >C#

热点推荐