微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 从另一个进程更新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);
}

我该怎么办?

解决方法

由于 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;
}

它现在正常工作..

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐