C# 调用另外一个程序

baidu_28322197 2015-05-19 04:02:33
有两个Windows窗体应用程序项目,A、B

现在需要程序A在某个功能中,调用B,并希望得到B处理后的某个信息

涉及C/S不多,不知道哪个方式合适

1、把程序B也COPY一份,放到A文件夹里面
Process的方式,去启动程序B,然后B处理后,把信息存在某个位置,A等待B结束后去获取

2、cmd的方式,类似上面

3、把B的窗体独立出一个项目来,然后一个单独的输出项目,单独的窗体B作为类库也可供A引用

或者其他更合适的方式

望各位大虾指导!
...全文
98 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
baidu_28322197 2015-05-19
  • 打赏
  • 举报
回复
感谢各位!!
失落的神庙 2015-05-19
  • 打赏
  • 举报
回复
这两个窗体通讯不就好了。
    protected override void DefWndProc(ref Message m)
        {
            switch (m.Msg)
            {
                //接收自定义消息MYMESSAGE,并显示其参数
                case 0x004A:
                    {
                        Win32API.COPYDATASTRUCT ml = new Win32API.COPYDATASTRUCT();
                        Type mytype = ml.GetType();
                        try
                        {
                            ml = (Win32API.COPYDATASTRUCT)m.GetLParam(mytype);
                            if (ml.lpData.Contains("MainHwnd|"))
                            {
                                MainFormList.Add(ml.lpData.Substring(ml.lpData.IndexOf("MainHwnd|")));
                            }
                            else if (ml.lpData.Contains("backhome返回主界面"))
                            {
                               
                            }
                            else
                            {
                               
                            }
                        }
                        catch { }
                    }
                    break;              
                default:
                    base.DefWndProc(ref m);
                    break;
            }
        }

  [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);

        public struct COPYDATASTRUCT
        {
            public IntPtr dwData;
            public int cbData;
            [MarshalAs(UnmanagedType.LPStr)]
            public string lpData;
        }
        //消息发送API
        [DllImport("User32.dll", EntryPoint = "SendMessage")]
        public static extern int SendMessage(
            IntPtr hWnd,        // 信息发往的窗口的句柄
            int Msg,            // 消息ID
            int wParam,         // 参数1
            int lParam          //参数2
        );

        //消息发送API
        [DllImport("User32.dll", EntryPoint = "SendMessage")]
        public static extern int SendMessage(
            IntPtr hWnd,        // 信息发往的窗口的句柄
            int Msg,            // 消息ID
            int wParam,         // 参数1
            ref  COPYDATASTRUCT lParam  //参数2
        );

        //消息发送API
        [DllImport("User32.dll", EntryPoint = "PostMessage")]
        public static extern int PostMessage(
            IntPtr hWnd,        // 信息发往的窗口的句柄
            int Msg,            // 消息ID
            int wParam,         // 参数1
            int lParam            // 参数2
        );


        //异步消息发送API
        [DllImport("User32.dll", EntryPoint = "PostMessage")]
        public static extern int PostMessage(
            IntPtr hWnd,        // 信息发往的窗口的句柄
            int Msg,            // 消息ID
            int wParam,         // 参数1
            ref  COPYDATASTRUCT lParam  // 参数2
        );

    }




    public class ShowMsg
    {
        static IntPtr hwnd = IntPtr.Zero;
        static Win32API.COPYDATASTRUCT ml = new Win32API.COPYDATASTRUCT();
        static ShowMsg()
        {
            EnumChildWindows(IntPtr.Zero, EnumWindowsProc_, "");
        }

        const int WM_COPYDATA = 0x004A;  //0x004A    0x61

        public static void Show(string msg)
        {            
            if(hwnd==IntPtr.Zero)
                EnumChildWindows(IntPtr.Zero, EnumWindowsProc_, "");
            ml.dwData = (IntPtr)100;
            ml.lpData = Color.Black.ToArgb().ToString() + "|系统--" + msg;
            //ml.r = 0;
            //ml.g = 0;
            //ml.b = 0;
            byte[] sarr = System.Text.Encoding.Default.GetBytes(ml.lpData);
            int len = sarr.Length;
            ml.cbData = len + 1;
            Win32API.SendMessage(hwnd, WM_COPYDATA, 0, ref ml);
        }

        public static void Show(Color c, string msg)
        {
            if (hwnd == IntPtr.Zero)
                EnumChildWindows(IntPtr.Zero, EnumWindowsProc_, "");
            ml.dwData = (IntPtr)100;
            ml.lpData = c.ToArgb().ToString() + "|系统--" + msg;
            //ml.r = c.R;
            //ml.g = c.G;
            //ml.b = c.B;
            byte[] sarr = System.Text.Encoding.Default.GetBytes(ml.lpData);
            int len = sarr.Length;
            ml.cbData = len + 1;
            Win32API.SendMessage(hwnd, WM_COPYDATA, 0, ref ml);
        }
        public delegate bool EnumChildWindow(IntPtr WindowHandle, string num);
        public static bool EnumWindowsProc_(IntPtr hWnd, string lParam)
        {
            var sb = new StringBuilder(500);
            GetClassName(hWnd, sb, sb.Capacity);
            if (sb.ToString().Contains("这里是窗体类名"))
            {
                GetWindowText(hWnd, sb, sb.Capacity);
                if (sb.ToString() == "这里是窗体标题")
                {
                    hwnd = hWnd;
                    return false;
                }
            }
            return true;
        }

        /// <summary>
        /// 获取指定窗体的所有子窗体
        /// </summary>
        /// <param name="WinHandle">窗体句柄</param>
        /// <param name="ec">回调委托</param>
        /// <param name="name">自定义</param>
        /// <returns></returns>
        [DllImport("User32.dll")]
        public static extern int EnumChildWindows(IntPtr WinHandle, EnumChildWindow ecw, string name);
        /// <summary>
        /// 获取窗体标题文本
        /// </summary>
        /// <param name="hWnd"></param>
        /// <param name="lpString"></param>
        /// <param name="nMaxCount"></param>
        /// <returns></returns>
        [DllImport("user32.dll", EntryPoint = "GetWindowText")]
        public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
        /// <summary>
        /// 获取类名
        /// </summary>
        /// <param name="WinHandle"></param>
        /// <param name="Type"></param>
        /// <param name="size"></param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        public static extern int GetClassName(IntPtr WinHandle, StringBuilder Type, int size);
    }
baidu_28322197 2015-05-19
  • 打赏
  • 举报
回复
引用 3 楼 lovelj2012 的回复:
你列举的三个方案,3最佳。 如果A、B是单独项目的两个exe,也可以通过反射调用B,B窗体的返回结果用反射获取 B窗体

//返回值
public string RetValue { get; set;}
A窗体调用B窗体

Form _CurrentForm = (Form)Assembly.Load("B窗体所在的exe名称").CreateInstance("命名空间.B窗体类名称");
_CurrentForm.ShowDialog(ParentForm);
//B窗体返回值
string _Result = _CurrentForm.GetType().GetProperty("RetValue ").GetValue(_CurrentForm, null).ToString();
感谢,我先试下~
江南小鱼 2015-05-19
  • 打赏
  • 举报
回复
你列举的三个方案,3最佳。 如果A、B是单独项目的两个exe,也可以通过反射调用B,B窗体的返回结果用反射获取 B窗体

//返回值
public string RetValue { get; set;}
A窗体调用B窗体

Form _CurrentForm = (Form)Assembly.Load("B窗体所在的exe名称").CreateInstance("命名空间.B窗体类名称");
_CurrentForm.ShowDialog(ParentForm);
//B窗体返回值
string _Result = _CurrentForm.GetType().GetProperty("RetValue ").GetValue(_CurrentForm, null).ToString();
bdmh 2015-05-19
  • 打赏
  • 举报
回复
最好是你可控制的,如果是两个单独的进程,因为做之处根本不知道你有什么业务逻辑,所以无法满足你的要求
Poopaye 2015-05-19
  • 打赏
  • 举报
回复
条件允许的话肯定是3最好

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧