Csharp/C#教程:从另一个进程更新TextBox文本分享


从另一个进程更新TextBox文本

我有两个WinForms应用程序,我需要从Application2向Application1中的TextBox添加文本。 我已经使用命名管道和WCF成功完成了这项工作。 我可以成功地从Application2调用Application1中的方法但是我得到“ 在创建窗口句柄之前无法在控件上调用Invoke或BeginInvoke。 ”错误或文本框根本没有更新。

这是我的基本代码。 Application2调用GetMessage 。 这个根本不更新TextBox:

 public void GetMessage(string msg) { UpdateTextbox(msg); } private void UpdateTextbox(string msg) { this.textBox1.Text += msg + Environment.NewLine; } 

这一个抛出Invoke错误:

 public void GetMessage(string msg) { Action a = () => UpdateTextbox(msg); textBox1.BeginInvoke(a); } 

我试图通过强制创建句柄来欺骗我的方式,但它也不会更新TextBox:

 public void GetMessage(string msg) { IntPtr handle = textBox1.Handle; Action a = () => UpdateTextbox(msg); textBox1.BeginInvoke(a); } 

我该怎么办?

通过这个答案解决了这个问题 。

问题是Form1的TextBox是在Form1的另一个实例上。 从Application1.Form1观察此代码,它启动命名管道服务:

 private void Form1_Load(object sender, EventArgs e) { ServiceHost host = new ServiceHost(typeof(Form1), new Uri[] { new Uri("net.pipe://localhost") }); host.AddServiceEndpoint(typeof(ISmsService), new NetNamedPipeBinding(), "PipeReverse"); host.Open(); } 

如果我理解正确,这将启动Form1的实例。 因此,当Application2调用Application1.GetMessage ,它调用ServiceHost-instance-Form1.GetMessage

要访问Form1主实例,我将代码更改为:

 public Form1() { InitializeComponent(); if (mainForm == null) { mainForm = this; } } private static Form1 mainForm; public static Form1 MainForm { get { return mainForm; } } private void UpdateTextbox(string msg) { MainForm.textBox1.Text += msg + Environment.NewLine; } 

它现在正常工作..

上述就是C#学习教程:从另一个进程更新TextBox文本分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/957304.html

(0)
上一篇 2021年11月21日
下一篇 2021年11月21日

精彩推荐