[DllImport("user32.dll")]
        private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);        [DllImport("user32.dll")]
        private static extern bool SetForegroundWindow(IntPtr hWnd);一个.NET的Form实例 只是先创建了一个form的实例然后并没有调用Form.Show()去show这个Form, 而是用ShowWindwAsync去显示这个Form, 但是这个时候, 可能由于Form.Show()方法里面做了一些Form的初始化工作, 包括子控件的创建等等... 所以当我第一次调用ShowWindowAsync去显示Form的时候, Form上的子控件都没有创建, 也就是显示出来是空白的(刚才工具栏拖出来的样子), 而当我第二次调用ShowWindowAsync的时候, Form就能正常显示了.
Form form = new Form();
IntPtr handle = form.Handle;
ShowWindowAsync(handle);比较明显的, 这个问题是由于我没有调用Form.Show(), 而直接调用API造成的. 我是想问一下, 有没有什么办法能够在没有调用Form.Show()的情况下, 也能够做好全部的初始化?可能有的人会问我为什么要这么做, 因为我有一个程序有两个Form, 而这两个Form的关闭都不会导致这个程序退出, 在托盘那里有一个图标, 可以退出这个程序. 而我又希望这个程序只能运行一个实例, 所以我用共享内存的方法储存了程序第一次创建的时候, 这个两个Form的句柄. 程序有两个快捷方式, 每个快捷方式可以启动到其中一个Form. 这个信息是由命令行参数传入Main函数的. 当程序第二次被启动的时候, 我会从命令行传入的参数检查用户需要从哪个Form启动, 然后我会从共享内存拿出相应的Form的句柄, 并且用前面所说的方法把那个Form显示出来.问题就出在这里. 比如我第一次启动程序, 我从A Form启动, 这时候B Form只是被构造出来, 并没有调用过他的Show()方法. 所以如果我之后第二次想要从B Form去启动的时候, 程序会去从共享内存取B Form的句柄, 并且把他显示出来... 这时候出来的B上面是空的...我试过SendMessage() 不行...  试过Form.CreateControl 不行...

解决方案 »

  1.   

    to 可能有的人会问我为什么要这么做, 因为我有一个程序有两个Form, 而这两个Form的关闭都不会导致这个程序退出, 在托盘那里有一个图标, 可以退出这个程序. 你只要控制好main函数即可避免你所说的问题,例如:
    http://blog.csdn.net/knight94/archive/2006/04/06/652394.aspx
      

  2.   

    to 而我又希望这个程序只能运行一个实例, 所以我用共享内存的方法储存了程序第一次创建的时候, 这个两个Form的句柄. 参看
    http://blog.csdn.net/knight94/archive/2006/05/24/752783.aspx
      

  3.   

    谢谢Knight94(愚翁), 不过你可能还没有完全理解我的意思. 我现在的问题是一个只是创建了一个实例, 但是并没有调用他的Show()方法 而是直接用API把他显示出来  那么在他第一次被显示的时候 他并没有能够正常显示(这很有可能是因为Show()方法中也做了一些窗口的初始化工作)所以我现在想要问的是 如何能够在不调用Show()方法的情况下 能够让这个Form完全初始化完毕...我就是用Mutex来判断程序是不是已经运行, 之后, 由于我要把已经存在, 并且Invisible的Form显示出来, 所以用了共享内存把这两个窗口的句柄存在共享内存当中. 并且从命令行参数取得从哪个Form启动, 之后取得这个Form的句柄, 然后调用API去show这个Form.
      

  4.   

    to thirdman(大肥猪)这样B Form会闪烁一次...
      

  5.   

    to 不过你可能还没有完全理解我的意思. 我现在的问题是一个只是创建了一个实例, 但是并没有调用他的Show()方法 而是直接用API把他显示出来 那么在他第一次被显示的时候 他并没有能够正常显示(这很有可能是因为Show()方法中也做了一些窗口的初始化工作)我给的文章中已经说了如何把一个窗体唯一化
      

  6.   

    我已经把窗体唯一化了 剩下的问题 是显示form的问题不过问题已经解决了... Show()方法会做初始化的猜测是错误的我没有做多余的事情 只是让我的程序在做唯一性检测之前不要做任何事情 而我之前就是在做这个检测之前做了很多事情... 我也不知道这是为什么  不过 Form被创建之后 应该已经被初始化完毕了 而不是Show方法去初始化的
      

  7.   

    第一次ShowWindowAsync时调用:form.CreateControl();
    如果你在Load事件中写了代码,还有调用一下Load事件函数。
      

  8.   

    参考一下
    Application.Run 方法 (ApplicationContext) 帮助
    或者
    http://www.funba.com/Resource/msdn/cpref/frlrfsystemwindowsformsapplicationclassruntopic2.htm可能对你有所启发。