在窗体需要重载方法,参考一下吧: /// <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 {
static extern IntPtr SendMessage(HandleRef hWnd, uint Msg, IntPtr wParam, IntPtr lParam);hWnd 就是 句柄
Msg 是 消息编码;
wParam和lParam是消息附加参数,得看你的消息而定
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消息的值
/// <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); }
你这样用当然是不对的,连 Handle是否有效都不判断