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

标签 c# .net winforms

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

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

public void GetMessage(string msg)
{
    UpdateTextbox(msg);
}

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

这个抛出调用错误:

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 的文本框在 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 文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10172035/

相关文章:

c# - 关于 C# 的 TDD 和 Mocks 处理的书籍

c# - Entity Framework 4 中的 Linq 查询。糟糕的性能

c# - 为什么在将项目添加到组合框时,值是相同的而不是通过循环增加?

winforms - BufferedGraphicsContext 错误

c# - 面板中的 RightToLeftLayout

c# - 与 Windows 7 相比,为什么 System.Drawing.Image.GetPropertyItem 在 Windows XP/2003 上的行为不同

c# - 使用 MongoDB 提供程序过滤多个参数

.net - 如何在单元测试 .net 中模拟 ClaimsPrincipal

c# - 有向图顶点子集的拓扑排序

c# - 在数据层中获取Azure连接字符串