c# – 从另一个进程更新TextBox文本

c# – 从另一个进程更新TextBox文本,第1张

概述我有两个WinForms应用程序,我需要从Application2向Application1中的TextBox添加文本.我使用命名管道和WCF成功完成了这项工作.我可以成功地从Application2调用Application1中的方法但是我得到“在创建窗口句柄之前无法在控件上调用Invoke或BeginInvoke.”错误或文本框根本没有更新. 这是我的基本代码. Application2调用G 我有两个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);}

我该怎么办?

解决方法 由于 this answer解决了这个问题.

问题是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# – 从另一个进程更新TextBox文本所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1234500.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存