加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 17:25:27 所属栏目:百科 来源:网络整理
导读:我有两个WinForms应用程序,我需要从Application2向Application1中的TextBox添加文本.我使用命名管道和WCF成功完成了这项工作.我可以成功地从Application2调用Application1中的方法但是我得到“在创建窗口句柄之前无法在控件上调用Invoke或BeginInvoke.”错误
我有两个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;
}

它现在正常工作..

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读