winform 进程间通信、模态显示窗口
来源:互联网 发布:展开windows文件卡住了 编辑:程序博客网 时间:2024/06/05 10:15
一:在运行的主程序需要位置去启动一个进程
Process proc = new Process(); proc.StartInfo.FileName = @"D:\MyCode\WindowsFormsApplication2\WindowsFormsApplication1\bin\Debug\Test1.exe"; proc.StartInfo.Arguments = "lb:bb bb:100,300,4400";//参数 proc.Start();
二:要启动的程序操作(模态显示窗体)
Test1.exe的 Main函数方法如下
/// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main(string[] args) { OpenApplicationContext app = new OpenApplicationContext(args); Application.Run(app);//public static void Run(ApplicationContext context); }
OpenApplicationContext 是继承自ApplicationContext 的一个,这个里面可以实现对参数的处理、打开指定窗口,部分代码如下
public class OpenApplicationContext : ApplicationContext { public OpenApplicationContext(string[] args) { if (args.Length > 1) { if (args[0].Contains("bb"))//打开webbrowser报表 { string[] paras = args[1].Substring(3).Split(','); ReportParasModel model = new ReportParasModel(); model.Height = int.Parse(paras[2]); model.Width = int.Parse(paras[3]); model.LinkUrl = paras[4]; model.Name = paras[5]; ReportWeb rw = new ReportWeb(model); rw.ShowInTaskbar = false; rw.StartPosition = FormStartPosition.Manual; rw.Left = int.Parse(paras[0]); rw.Top = int.Parse(paras[1]); Process[] proces = Process.GetProcessesByName("PT4MainFrame");//获取进程 if (proces.Length != 0) { IntPtr hwnd = proces[0].MainWindowHandle; rw.BringToFront(); rw.Show(new WindowWrapper(hwnd)); //也可以用ShowDialog(new WindowWrapper(hwnd)); } } else if (args[0].Contains("wf"))//打开Winform报表 { //省略 } } } }
new WindowWrapper(hwnd)); 是一个继承自IWin32Window的类,代码如下
public class WindowWrapper : System.Windows.Forms.IWin32Window { public WindowWrapper(IntPtr handle) { _hwnd = handle; } public IntPtr Handle { get { return _hwnd; } } private IntPtr _hwnd; }
三:实现进程间通信(共享内存方法)
在主程序里添加API
const int WM_COPYDATA = 0x004A; [DllImport("User32.dll", EntryPoint = "FindWindow")] private static extern int FindWindow(string lpClassName, string lpWindowName); [DllImport("User32.dll", EntryPoint = "SendMessage")] private static extern int SendMessage( int hWnd, // handle to destination window int Msg, // message int wParam, // first message parameter ref COPYDATASTRUCT lParam // second message parameter ); public struct COPYDATASTRUCT { public IntPtr dwData; public int cbData; [MarshalAs(UnmanagedType.LPStr)] public string lpData; }
主程序方调用方法给指定进程窗口穿参数,部分代码
private void contractMenu_OnItemClick{ int WINDOW_HANDLER = FindWindow(null, @"HwReportWeb");//HwReportWeb 为窗体上标题Text值 if (WINDOW_HANDLER != 0)//存在该窗体 { //height,width,url,name string paras = height + "," + width + "," + url +","+ name; byte[] sarr = System.Text.Encoding.Default.GetBytes(paras); int len = sarr.Length; COPYDATASTRUCT cds; cds.dwData = (IntPtr)100; cds.lpData = paras; cds.cbData = len + 1; SendMessage(WINDOW_HANDLER, WM_COPYDATA, 0, ref cds); }}
主程序调用端已经完成,下面就是新打开的进程窗体接收这些消息,部分代码如下
const int WM_COPYDATA = 0x004A; public struct COPYDATASTRUCT { public IntPtr dwData; public int cbData; [MarshalAs(UnmanagedType.LPStr)] public string lpData; } protected override void WndProc(ref Message m) { switch (m.Msg) { case WM_COPYDATA: COPYDATASTRUCT mystr = new COPYDATASTRUCT(); Type mytype = mystr.GetType(); mystr = (COPYDATASTRUCT)m.GetLParam(mytype); string[] paras = mystr.lpData.Split(','); //height,width,url,name ReportParasModel paraModel = new ReportParasModel(); paraModel.Height = int.Parse(paras[0]); paraModel.Width = int.Parse(paras[1]); paraModel.LinkUrl = paras[2]; paraModel.Name = paras[3]; ReloadUrl(paraModel); this.BringToFront(); break; default: base.WndProc(ref m); break; } }
至此,进程通信完成。
0 0
- winform 进程间通信、模态显示窗口
- 进程间消息通信实现窗口控制
- winform窗口显示的BUG
- C#进程间通信,传递消息给其它窗口
- 模态显示窗口
- C#实现WinForm窗口全屏显示
- C# winform 窗口关闭按钮不显示
- C#WinForm程序显示控制台窗口Console
- 进程&进程间通信
- electron窗口和主进程通信ipc
- Linux ipcs --显示进程间通信设施状态
- JS显示模态窗口
- c# winform来显示进程和杀死进程
- 父子窗口间通信
- Qt 窗口间通信
- 信号通信(进程间通信)
- 进程间通信-管道通信
- 进程间通信--管道通信
- EDM学习之邮件营销测试策略分享
- 用 python 创建 cocos2dx 项目工程
- 微软图形控件(Chart或MSchart)的用法
- LiveCode应用的结构
- UTF-8 ANSI Unicode Unicode big endian 乱码 文件格式 文件头
- winform 进程间通信、模态显示窗口
- #if,#ifdef和#if defined
- wordpress中终端侦测短代码
- 抽象工厂模式
- ISO8583报文协议
- Learning D3.js(5) d3的path讲解
- Linux shell之sort命令
- 并行编程之数据并行
- Matlab求解线性方程组