您的位置:首页 > 编程语言 > VB

子线程无法创建窗体的问题

2009-06-24 15:44 148 查看
最近开发IM项目的时候,遇到一个问题:客户端收到消息的时候,要弹出对话款。
我是单开一个线程来监听服务器消息的,当收到消息的时候如果窗口没打开,则自动打开。
问题出现了,窗体打开后即死掉,反白
首先想到的是可能代码写错了,于是检查几次,都未发现问题。于是想到可能是线程里创建窗体权限的问题。有在主窗体上拖个按钮,写上创建新窗体的代码,运行发现一切正常。
这时候就确定是线程的问题了。
主窗口用于主线程,用以接收各种系统消息。可能是我的子线程和系统交互的消息受阻。
这时候尝试在 
Form frmObj = new Form ( );
frmObj. Show ( System. Windows. Forms. IWin32Window ); 
的Show()方法里面做文章。
 
查阅了一些网文,找到了一篇看似有帮助的帖子。代码是vb.net的,然后把它翻译成C#。代码如下:
实现了IWin32Window接收,
    public class WindowWrapper : System. Windows. Forms. IWin32Window
    {
        private System. IntPtr _hwnd;
        public WindowWrapper ( System. IntPtr handle )
        {
            _hwnd = handle;
        }
        public System. IntPtr Handle
        {
            get { return _hwnd; }
        }
    }
然后在封装系统的一个获取当前主窗体的API.
    [System. Runtime. InteropServices. DllImport ( "user32")]
    public static extern  System. IntPtr GetForegroundWindow();
最后在我的线程方法里调用
    System. IntPtr IntPart;
   IntPart = GetForegroundWindow ( );
    WindowWrapper OwinForm = new WindowWrapper ( IntPart );
    frmChat frmObj = new frmChat ( cm );
    frmObj. Show ( OwinForm );
 
本以为新创建的窗体已经依附于主窗体了,应该可以像正常窗体一下。
结果发现还是死掉。
 
思考中。。。既然是主线程才能创建的窗体对象,那我就用拥有主线程的主窗体来创建。哈哈。
当前窗体拥有主线程,所以一切就顺利起来了。
代码:
 
 
     void GetActiveWindowMehtod ( )
     {
           //在拥有主窗体的线程上创建子窗体  
       this. Invoke ( new GetActiveWindowHandle ( GetActiveWindow ));
     }
     delegate void GetActiveWindowHandle ( );
     void GetActiveWindow ( )
     {
          //在这里写创建新窗体的代码
       frmChat fc = new frmChat ( );
       fc. Show ( );           
     }
 
然后在子线程的方法了调用 GetActiveWindowMehtod();
运行窗体正常显示。
 
这么几句代码,每天都在写好多遍。遇到问题就不一定能像的起来。越是简单的问题越要仔细。
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  vb.net 服务器 class c# user im