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;
}
}
[解决办法]
顶把,,,是不是消息常数定义的有问题,被别的占用了