如何在C#中强制创建Winform句柄

本文关键字:创建 Winform 句柄 | 更新日期: 2023-09-27 17:58:52

我收到以下运行时错误消息

在创建窗口句柄之前,不能对控件调用Invoke或BeginInvoke。

我的winform构造函数正在创建一些对象,其中一个对象接收异步TCP/IP数据。长话短说,我有一些事件委托,允许接收网络数据的类从Winform调用例程,将数据打印到文本框中。这样我就可以看到收到了什么。我可以看到数据立即被接收。这种情况发生在winform构造函数完成之前。

我仔细阅读了一遍,在创建了winform或winform组件的句柄之前,您不能调用它。我怀疑这就是我所违反的。据推测,这是一种强制作用。在创建接收TCP/IP数据的类之前,我尝试将以下代码添加到我的winform构造函数中以强制创建。然而,错误仍然存在。

InitializeComponent();
this.CreateControl();
this.HistoryBox.CreateControl();

以下是我的winform委托的代码,以防有帮助:

    public void Print_Console_Message(string message)
    {
        Console_Output.Enqueue(message);
        this.Invoke(new EventHandler(PrintToConsole));
    }
    private void PrintToConsole(object sender, EventArgs e)
    {
        string message = Console_Output.Dequeue();
        if (message.Length != 0)
        {
            HistoryBox.AppendText(message + "'n" + "'n");
        }
    }

我意识到有一种方法可以检查对象句柄是否已创建,并在这种情况下避免调用,但是,我对简单地抑制一些输出不感兴趣。

有人知道我如何强制创建句柄或控件,以便在构造函数完成之前调用委托函数吗?

如何在C#中强制创建Winform句柄

根据文档,您可以通过获取.Handle属性来完成此操作。

如果尚未创建句柄,则引用此属性将强制创建句柄。

或者,您可以侦听HandleCreated事件,并且在它被激发后仅侦听Invoke