vb运行form2,怎样不激活form1?

时间:2022-07-09 00:58:12
工程有2个窗体:form1 和 form2
=====================================
form1的代码(启动窗体):

Private Sub Form_Load() '启动时 form2 隐藏
Form2.Hide
End Sub

from2 的代码:有1个timer1 ,Interval=5000 5秒

Private Sub Timer1_Timer()
Me.Show ‘显示出form2
End Sub
======================================
现在的问题是:
当 form1 被其他窗口挡住的时候(不可见,但不是visible=false),form2弹出的时候,form1也会被激活显示出来。
如何才能使form2运行的时候,form1不被激活。同时form1不能hide,不能最小化。

17 个解决方案

#1


如果你两个form之间没有相互关联的数据的话, 可以在模块中加上启动函数:
sub main()
load form2
end sub

然后工程属性设置从sub main启动, 随便你想先显示哪一个窗体都行.

还有一种方法就是直接设置工程属性让form2为启动窗体.

#2


楼上的方法还是不行的。
form2显示的时候,还是会激活form1。

#3


如果F2是F1的子窗体,那必然要显示F1的.
你把F2设为独立的窗体,那样在F1里面也不必用Form2.Hide了,因为只要不加载,F2就不存在.

#4


谢谢楼上的回答。
不加载form2,怎么运行form2的代码?form2有个timer的。
不管是show还是load,都得加载form2。

form2默认是隐藏的(hide),通过timer1才显示出form2.

现在的问题是:form2显示的时候,会激活from1的界面,而我们要做的是如何不激活form1(这是我的问题)

form2 并不是form1的子窗体,是独立的。

#5


改成Me.Show vbModal,form1试试

#6


Me.Show vbModal,form1 更不行了

#7


引用 2 楼  的回复:
楼上的方法还是不行的。
form2显示的时候,还是会激活form1。


你重建一个新的测试工程试试:两个窗体模块,一个标准模块。在标准模块 Main() 中显示 Form2。

#8


这是Windows标准的行为模式,不可变更。
Form1 被其他窗口挡住的时候,等于当前活动程序是其他某个程序。
Form2 弹出是,当前活动程序就变成你的程序,该程序的所有的窗口都会排到其他程序的窗口之前。

#9


如果 Tiger_Zhao 的回答是正确的,这个问题就没办法了!
难道真的没办法吗?
看过其他语言写的软件,似乎都能解决这个问题。难道vb是个例还是微软的语言都这样?

期待有类似经验或者对此问题有兴趣的朋友给个其他解决方案。

#10


呵呵,楼主估计连工程的启动项目都没有调整,启动项目选择sub main,然后再按照楼上说的写代码。

单说两个窗体都加载出来的话,你需要将两个窗体设置为大小一致的,且form2显示区域覆盖form1的显示区域。

#11


引用 9 楼  的回复:
看过其他语言写的软件,似乎都能解决这个问题。难道vb是个例还是微软的语言都这样?

什么软件?
记事本之打开两个文档,在任务管理器中可以看到两个 notepad.exe!而你的两个窗口是属于同一个 exe 的。

#12


先感谢几位的回答。
AisaC 先看清楚我的问题,代码我已经贴出来了,要达到的效果在下面的回复也讨论的比较清楚了。

Tiger_Zhao 第一次的解答是我最困惑的,因为这已经做过无数次尝试了,找过、搜索过不少资源,也看到有人提示这个windows的限制等等。

2个记事本,是不同的exe,或者exe允许重复启动(2个exe进程),不是一个exe的2个不同的窗体。
我要的一个exe2个不同的窗体,而且是根据timer启动的。

#13


前面我确实没看清楚,不好意思。


假如你还有第三个窗体form3,form3是启动后就运行的,form3调用form1内的代码来控制timer1是否可用,这样才可以实现。

如果没有第三方的窗体或者是一个线程,这个问题应该不能实现。

#14


用C试了一下,的确可以做到,应该不是windows的问题,而是VB的问题,拦截form1的消息,并没有收到激活窗口的消息,说明窗口并没有被激活,而可能只是改变了Z序显示出来。

#15



我做了一个工程进行测试。没有出现搂主所说的问题。

最好不要动不动就假定微软的 VB 开发团队比我们这些初学者还要傻。事实上,他们比我们这里大多数人聪明。

#16


再次感谢各位给予回答。

AisaC的代码我试过。不管用第三个窗体form3来显示form2(form3中代码form2.show或form2.visble=true)。还是form2自己show出来(me.show或者me.visble=true),都会激活form1.
另外通过sub main 来load或show这几个窗体都和上面是一个效果。

注意:form1的是主窗体,他的状态是可见的,只是我们点了屏幕或者点了其他应用程序造成了软件(form1)被其他程序遮挡住了,form1状态不是visile=false 也不是 hide 也不是最小化 。

c_cyd2008:的方法某种程度上有可行的,只有在确定这确实是vb无法解决的才能用这方法。
我曾尝试用判断form1是不是被其他窗口挡住的方式来写代码。如果form1被其他窗口挡住,form1就最小化,form2再show,但是需要考虑情况太多,似乎也不是最完美的。这个问题暂不考虑。

of123:没发现我的说的问题,那应该你没看清楚我的问题。当然我现在无法确定是不是微软的限定,所以我们才有了上面的讨论。

#17


引用 16 楼  的回复:
再次感谢各位给予回答。

AisaC的代码我试过。不管用第三个窗体form3来显示form2(form3中代码form2.show或form2.visble=true)。还是form2自己show出来(me.show或者me.visble=true),都会激活form1.
另外通过sub main 来load或show这几个窗体都和上面是一个效果。

注意:form1的是主窗体,他的状态……

我没有VB6的环境,我没编写代码也没测试,按照我的思路用C#写出来的程序没问题,可以运行。

#1


如果你两个form之间没有相互关联的数据的话, 可以在模块中加上启动函数:
sub main()
load form2
end sub

然后工程属性设置从sub main启动, 随便你想先显示哪一个窗体都行.

还有一种方法就是直接设置工程属性让form2为启动窗体.

#2


楼上的方法还是不行的。
form2显示的时候,还是会激活form1。

#3


如果F2是F1的子窗体,那必然要显示F1的.
你把F2设为独立的窗体,那样在F1里面也不必用Form2.Hide了,因为只要不加载,F2就不存在.

#4


谢谢楼上的回答。
不加载form2,怎么运行form2的代码?form2有个timer的。
不管是show还是load,都得加载form2。

form2默认是隐藏的(hide),通过timer1才显示出form2.

现在的问题是:form2显示的时候,会激活from1的界面,而我们要做的是如何不激活form1(这是我的问题)

form2 并不是form1的子窗体,是独立的。

#5


改成Me.Show vbModal,form1试试

#6


Me.Show vbModal,form1 更不行了

#7


引用 2 楼  的回复:
楼上的方法还是不行的。
form2显示的时候,还是会激活form1。


你重建一个新的测试工程试试:两个窗体模块,一个标准模块。在标准模块 Main() 中显示 Form2。

#8


这是Windows标准的行为模式,不可变更。
Form1 被其他窗口挡住的时候,等于当前活动程序是其他某个程序。
Form2 弹出是,当前活动程序就变成你的程序,该程序的所有的窗口都会排到其他程序的窗口之前。

#9


如果 Tiger_Zhao 的回答是正确的,这个问题就没办法了!
难道真的没办法吗?
看过其他语言写的软件,似乎都能解决这个问题。难道vb是个例还是微软的语言都这样?

期待有类似经验或者对此问题有兴趣的朋友给个其他解决方案。

#10


呵呵,楼主估计连工程的启动项目都没有调整,启动项目选择sub main,然后再按照楼上说的写代码。

单说两个窗体都加载出来的话,你需要将两个窗体设置为大小一致的,且form2显示区域覆盖form1的显示区域。

#11


引用 9 楼  的回复:
看过其他语言写的软件,似乎都能解决这个问题。难道vb是个例还是微软的语言都这样?

什么软件?
记事本之打开两个文档,在任务管理器中可以看到两个 notepad.exe!而你的两个窗口是属于同一个 exe 的。

#12


先感谢几位的回答。
AisaC 先看清楚我的问题,代码我已经贴出来了,要达到的效果在下面的回复也讨论的比较清楚了。

Tiger_Zhao 第一次的解答是我最困惑的,因为这已经做过无数次尝试了,找过、搜索过不少资源,也看到有人提示这个windows的限制等等。

2个记事本,是不同的exe,或者exe允许重复启动(2个exe进程),不是一个exe的2个不同的窗体。
我要的一个exe2个不同的窗体,而且是根据timer启动的。

#13


前面我确实没看清楚,不好意思。


假如你还有第三个窗体form3,form3是启动后就运行的,form3调用form1内的代码来控制timer1是否可用,这样才可以实现。

如果没有第三方的窗体或者是一个线程,这个问题应该不能实现。

#14


用C试了一下,的确可以做到,应该不是windows的问题,而是VB的问题,拦截form1的消息,并没有收到激活窗口的消息,说明窗口并没有被激活,而可能只是改变了Z序显示出来。

#15



我做了一个工程进行测试。没有出现搂主所说的问题。

最好不要动不动就假定微软的 VB 开发团队比我们这些初学者还要傻。事实上,他们比我们这里大多数人聪明。

#16


再次感谢各位给予回答。

AisaC的代码我试过。不管用第三个窗体form3来显示form2(form3中代码form2.show或form2.visble=true)。还是form2自己show出来(me.show或者me.visble=true),都会激活form1.
另外通过sub main 来load或show这几个窗体都和上面是一个效果。

注意:form1的是主窗体,他的状态是可见的,只是我们点了屏幕或者点了其他应用程序造成了软件(form1)被其他程序遮挡住了,form1状态不是visile=false 也不是 hide 也不是最小化 。

c_cyd2008:的方法某种程度上有可行的,只有在确定这确实是vb无法解决的才能用这方法。
我曾尝试用判断form1是不是被其他窗口挡住的方式来写代码。如果form1被其他窗口挡住,form1就最小化,form2再show,但是需要考虑情况太多,似乎也不是最完美的。这个问题暂不考虑。

of123:没发现我的说的问题,那应该你没看清楚我的问题。当然我现在无法确定是不是微软的限定,所以我们才有了上面的讨论。

#17


引用 16 楼  的回复:
再次感谢各位给予回答。

AisaC的代码我试过。不管用第三个窗体form3来显示form2(form3中代码form2.show或form2.visble=true)。还是form2自己show出来(me.show或者me.visble=true),都会激活form1.
另外通过sub main 来load或show这几个窗体都和上面是一个效果。

注意:form1的是主窗体,他的状态……

我没有VB6的环境,我没编写代码也没测试,按照我的思路用C#写出来的程序没问题,可以运行。