您的位置:首页 > 其它

WPF通过消息机制实现进程间通信(IPC)

2012-10-16 12:38 417 查看
接收端代码:

[StructLayout(LayoutKind.Sequential)]
public struct CopyDataStruc
{
public IntPtr dwData;
public int cbData;  // 字符串长度
[MarshalAs(UnmanagedType.LPStr)]
public string lpData; // 字符串
}

private void Window_Loaded(object sender, RoutedEventArgs e)
{
(PresentationSource.FromVisual(this) as HwndSource).AddHook(new HwndSourceHook(this.WndProc));
}

IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == MessageHelper.WM_DOWNLOAD_COMPLETED)
{
//CopyDataStruct cds = (CopyDataStruct)System.Runtime.InteropServices.Marshal.PtrToStructure(lParam, typeof(CopyDataStruct));
MessageBox.Show("I got it!");
}

return hwnd;
}


发送端代码:

private void PostMessage()
{
Process proc = Process.GetProcessesByName("MyAppSample")[0];
//Process[] procs = Process.GetProcesses();
//foreach (Process p in procs)
//{
//    if (p.ProcessName == "MyAppSample")
//    {
//        proc = p;
//    }
//}
IntPtr hwnd = MessageHelper.FindWindow(null, "MainWindow");
MessageHelper.PostMessage(hwnd, MessageHelper.WM_DOWNLOAD_COMPLETED, IntPtr.Zero, IntPtr.Zero);
MessageHelper.PostMessage(proc.MainWindowHandle, MessageHelper.WM_DOWNLOAD_COMPLETED, IntPtr.Zero, IntPtr.Zero);
}
public class MessageHelper
{
public const int WM_DOWNLOAD_COMPLETED = 0x00AA;

[DllImport("User32.dll", EntryPoint = "FindWindow")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("User32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(IntPtr wnd, int msg, IntPtr wP, IntPtr lP);
//private static extern int SendMessage
//(
//    IntPtr hWnd,    //目标窗体句柄
//    int Msg,        //WM_COPYDATA
//    int wParam,     //自定义数值
//    ref  CopyDataStruct lParam //结构体
//);

[DllImport("User32.dll", EntryPoint = "PostMessage")]
public static extern int PostMessage(IntPtr wnd, int msg, IntPtr wP, IntPtr lP);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: