何时创建窗口句柄

时间:2011-05-09 05:21:14

标签: .net winforms events

我认为我的代码是安全的,但事实并非如此。

我正在使用表单来显示在我的应用中的其他位置创建和管理的一些消息。

要获得此消息,我正在使用我在form.load事件中添加到外部事件的委托。

private void ErrorLog_Load( object sender, EventArgs e )
{
    //error handler has been properly initialized in the ctor
    Handler.getInstance( ).errorOccured += errorHandler;
}

我需要调用的表单的回调:

protected void handleError( SenderInfo sender, ErrorEventArgument argument )
{
    if (this.InvokeRequired)
    {
        this.Invoke(errorHandler, new object[] { sender, argument });
    }
    else
    {
       //update the form
    }
}

在关闭/关闭事件中,回调未注册。

现在我的情况是窗口被创建为一个明显没有显示的mdi子窗口(被另一个mdi窗口隐藏),并且应用程序在带有Invoke的行的handleError中崩溃,并显示窗口句柄尚未创建的消息

所以有三个问题: 在哪个时间点是创建的表单的窗口句柄 将this.IsHandleCreated添加到我handleError的公寓应该如何改进我的代码 取消注册回调的正确事件是什么?

TIA

马里奥

1 个答案:

答案 0 :(得分:1)

认为句柄是在调用HandleCreated事件时创建的(在.NET 3.5中可用,但它隐藏在设计器中),但我不认为这是完全正确的,因为你还需要获得this.Handle。我在.NET 4文档中看到了一个更好的事件,但我不确定。我在v3.5中提出的最稳定的方法在构造函数中是这样的,但是窗口似乎闪烁,所以不确定这是否会在窗口不可见的情况下工作:

public ErrorLog() 
{
    InitializeComponent();

    this.HandleCreated += new EventHandler((sender, args) =>
    {
        var handle = this.Handle;
        // handle is _probably most likely_ created so now hook up the event etc
        ...
    }
}

我想你会在FormClosing事件中取消注册你的回调。