发送信息 通过sendmessag发送信息。并传递一个字符串。 能够收到信息 但收到的结构中的字符串为空??源代码:
发送方:
private static readonly int CUSTOM_MESSAGE = 0X400 + 2;
//api声明
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(
IntPtr hWnd, // 信息发住的窗口的句柄
int Msg, // 消息ID
int wParam, // 参数1
ref messagstring lParam // 参数2 [MarshalAs(UnmanagedType.LPTStr)]StringBuilder lParam
);
发送代码:
IntPtr hwnd_win;
hwnd_win = FindWindow(null, "reseviceform"); //找到要发送的窗体
string strtext = "aaa";
messagstring ms;
ms.lpData = strtext;
SendMessage(hwnd_win, CUSTOM_MESSAGE, 0, ref ms);
接收方: protected override void WndProc(ref Message m)
{
if (m.Msg == CUSTOM_MESSAGE)
{
messagstring ms=new messagstring () ;
Type mytype = ms.GetType();
ms = (messagstring)m.GetLParam(mytype); textBox1.Text =Convert.ToString ( ms.lpData);
}
base.WndProc(ref m);
}发送的数据结构
namespace copyMessage
{
//要发信息数据结构,作为SendMessage函数的LParam参数
public struct messagstring
{
[MarshalAs(UnmanagedType.LPStr)]
public string lpData; //要发送的信息
}
}
发送方:
private static readonly int CUSTOM_MESSAGE = 0X400 + 2;
//api声明
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(
IntPtr hWnd, // 信息发住的窗口的句柄
int Msg, // 消息ID
int wParam, // 参数1
ref messagstring lParam // 参数2 [MarshalAs(UnmanagedType.LPTStr)]StringBuilder lParam
);
发送代码:
IntPtr hwnd_win;
hwnd_win = FindWindow(null, "reseviceform"); //找到要发送的窗体
string strtext = "aaa";
messagstring ms;
ms.lpData = strtext;
SendMessage(hwnd_win, CUSTOM_MESSAGE, 0, ref ms);
接收方: protected override void WndProc(ref Message m)
{
if (m.Msg == CUSTOM_MESSAGE)
{
messagstring ms=new messagstring () ;
Type mytype = ms.GetType();
ms = (messagstring)m.GetLParam(mytype); textBox1.Text =Convert.ToString ( ms.lpData);
}
base.WndProc(ref m);
}发送的数据结构
namespace copyMessage
{
//要发信息数据结构,作为SendMessage函数的LParam参数
public struct messagstring
{
[MarshalAs(UnmanagedType.LPStr)]
public string lpData; //要发送的信息
}
}
IntPtr hwnd_win;
hwnd_win = FindWindow(null, "reseviceform"); //找到要发送的窗体
if (hwnd_win.ToInt32() == null)
{
string strtext = "aaa";
messagstring ms;
ms.lpData = strtext;
SendMessage(hwnd_win, CUSTOM_MESSAGE, 0, ref ms);
// 可以使用当前窗口测试
//SendMessage(this.Handle,CUSTOM_MESSAGE 0, ref ms);
}
else
{
MessageBox.Show("找不到窗口");
}
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(
IntPtr hWnd, // 信息发住的窗口的句柄
int Msg, // 消息ID
int wParam, // 参数1
StringBuilder lParam
);
用这样的声明可以吗?
http://www.chenjiliang.com/Article/View.aspx?ArticleID=2277&TypeID=84关于C#中实现两个应用程序消息通讯的问题
http://www.chenjiliang.com/Article/View.aspx?ArticleID=3495&TypeID=79
接受方。
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; } } 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
);
const int WM_COPYDATA = 0x004A;
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}发送..
const int WM_CHAR = 0x0102;
IntPtr hwnd_win;
IntPtr hwnd_textbox; hwnd_win = FindWindow(null, "Form4");
const int BM_CLICK = 0x00F5;
COPYDATASTRUCT cds;
cds.dwData = (IntPtr)100;
cds.lpData = "Test Message";
cds.cbData = 14; //Message msg = Message.Create(hwnd_textbox, BM_CLICK, new IntPtr(0), new IntPtr(0));
//// PostMessage(msg.HWnd, msg.Msg, msg.WParam, msg.LParam);
////SendMessage(hwnd_textbox, BM_CLICK, 0, ref cds);
SendMessage(hwnd_win, WM_COPYDATA, 0, ref cds);
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); [DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern IntPtr PostMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
可以收到。。正确信息...