2011-05-09 126 views
2

我认为我的代码是安全的,但事实并非如此。什么时候创建窗口句柄

我正在使用表单来显示一些在我的应用程序的其他地方创建和管理的消息。

要获得此消息,我正在使用一个代理,将其添加到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窗口隐藏),并且该应用程序在调用消息时窗口句柄没有被创建。

所以三个问题: 在哪个时间点是形式的窗口句柄从加入this.IsHandleCreated创建 Appart酒店我handleError我应该如何提高我的代码 什么是注销回调正确的事件?

TIA

马里奥

+0

你可以检查handleError/errorHandler,是一个错字或问题的原因? – 2011-05-09 06:58:29

+0

@亨克不,这不是一个错字。在调用中,我重新使用在ctor中创建的委托,它指向handleError(我只是懒于创建一个新的) – 2011-05-09 07:00:10

回答

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事件中注销你的回调。

+0

谢谢!似乎是最逻辑的场景! – 2011-10-09 17:51:12