[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 不行...
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 不行...
http://blog.csdn.net/knight94/archive/2006/04/06/652394.aspx
http://blog.csdn.net/knight94/archive/2006/05/24/752783.aspx
如果你在Load事件中写了代码,还有调用一下Load事件函数。
Application.Run 方法 (ApplicationContext) 帮助
或者
http://www.funba.com/Resource/msdn/cpref/frlrfsystemwindowsformsapplicationclassruntopic2.htm可能对你有所启发。