[DllImport("User32.dll", EntryPoint = "FindWindow")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("User32.dll", EntryPoint = "FindWindowEx")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpClassName, string lpWindowName);
///
/// 消息发送API
///
/// 指定要接收消息的窗口的句柄
/// 指定被发送的消息ID
/// 指定附加的消息特定信息
/// 指定附加的消息特定信息
/// 返回值指定消息处理的结果,依赖于所发送的消息
[DllImport("User32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
[DllImport("User32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, ref string lParam);
[DllImport("User32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(IntPtr win, int WM_COPYDATA, IntPtr wParam, ref COPYDATASTRUCT cds);
///
/// 异步消息发送API
///
/// 指定要接收消息的窗口的句柄
/// 指定被发送的消息ID
/// 指定附加的消息特定信息
/// 指定附加的消息特定信息
///
[DllImport("User32.dll", EntryPoint = "PostMessage")]
public static extern int PostMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
[DllImport("User32.dll", EntryPoint = "SendMessage")]
public static extern int PostMessage(IntPtr win, int WM_COPYDATA, IntPtr wParam, ref COPYDATASTRUCT cds);
[DllImport("User32.dll", EntryPoint = "SendMessage")]
public static extern int PostMessage(IntPtr win, int WM_COPYDATA, IntPtr wParam, ref string str);
///
/// 接收信息
///
/// 带文本的窗口或控件的句柄
/// 指向接收文本的缓冲区的指针
/// 指定要保存在缓冲区内的字符的最大个数,其中包含NULL字符。如果文本超过界限,它就被截断
///
[DllImport("User32.Dll")]
public static extern int GetWindowText(int hwnd, StringBuilder buf, int nMaxCount);
// 不能再加上类名限定,否则会找不到
IntPtr win = Win32API.FindWindow(null,"窗体标题");
这比较简单。
// 发
Win32API.PostMessage(win,0x890,IntPtr.Zero,Marshal.StringToHGlobalAnsi(str));
// 收
string str = Marshal.PtrToStringAnsi(m.LParam);
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
const int WM_COPYDATA = 0x004A;
// 发
string str = "test";
byte[] sarr = System.Text.Encoding.Default.GetBytes(str);
int len = sarr.Length;
COPYDATASTRUCT cds;
cds.dwData = (IntPtr)Convert.ToInt16(123);//可以是任意值
cds.cbData = len + 1;//指定lpData内存区域的字节数
cds.lpData = str;//发送给目标窗口所在进程的数据
Win32API.PostMessage(win, WM_COPYDATA, IntPtr.Zero, ref cds);
// 收
protected override void DefWndProc(ref Message m)
{
switch (m.Msg)
{
case WM_COPYDATA:
COPYDATASTRUCT cds = new COPYDATASTRUCT();
Type t = cds.GetType();
cds = (COPYDATASTRUCT)m.GetLParam(t);
string strResult = cds.dwData.ToString() + ":" + cds.lpData;
MessageBox.Show(strResult);
break;
default:
base.DefWndProc(ref m);
break;
}
}
// 发送:0x890是自定义的消息号,btn_Send是界面的一个控件,这会将该控件的Text值发送出去
Win32API.PostMessage(win, 0x890, this.btn_Send.Handle, IntPtr.Zero);
// 接收
protected override void DefWndProc(ref Message m)
{
StringBuilder sb = new StringBuilder(1024 * 2);
switch (m.Msg)
{
case 0x890:
Win32API.GetWindowText(m.WParam.ToInt32(), sb, sb.Capacity);
MessageBox.Show(sb.ToString());
break;
default:
base.DefWndProc(ref m);
break;
}
}