SOS! 关于后台窗口弹到前台的问题,急急急!!!(100分)

  • 主题发起人 主题发起人 DickWu
  • 开始时间 开始时间
D

DickWu

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序在接受到系统信息后要弹出到前台,但如果我的程序如果打开
了另外一个模态窗口后,好象就弹不到前台了,各位大侠有什么好办法啊?

我的程序中用了以下语句弹出窗口到前台:
Application.Restore;
SetForegroundWindow(Application.MainForm.Handle);
BringWindowToTop(Application.MainForm.Handle);
不知道什么原因,只要这个程序有一个模态窗口打开着(在我的主Form前面,
还有一个打印预览窗口Form,是用ShowModual方式打开的),应用程序就弹不
到前台,除非在底下的状态条上点一下.

我试验了一下,在程序中打开一个模态About窗口,程序也不能弹出到前台
了,如果不开模态窗口,则一切正常。

这个功能是在防止程序开第儿个实例的功能中用的,当打开第二个实例时,
它把第一个实例弹到前台,然后退出.

大家给想想办法吧,我可要急死了.
 
If you want to active the first application you ran, why you want to pop up the
exact window? if you really wanna do so, you can hide the modal dialog, or make
your mainform stayontop temply. and i think, setforegroundwindow is enough,
bringwindowtotop is nessary here
 
是这样的,我做的一个项目是个双屏显示的,在这个项目中,主程序是个工业组态软件FIX,
我的程序PR.EXE是通过在该FIX软件中点击按钮运行外部程序的方式调用的,当我的程序正在预览
状态时,如果用户到另外一个显示器上点击一下,就会把我的程序窗口切换到后面,
这时如果用户还是要看刚才的预览窗口的话,就到FIX的按钮上点击再运行我的程序,
这时我的程序如果发现已经有实例在运行的话,就会通知该程序激活自己到前台,
但PR.EXE接收到通知消息后,如果这时预览窗口已经打开,就不能把自己弹出到前台。
该预览窗口是PR.EXE的报表打印预览窗口,是以模式显示的方式由PR.EXE打开的。
这就是我的问题,是不是很罗嗦?不过我想问题说清楚了吧。那位高手伸一下手,
帮我一下啊,我要急死了 :~~(

我试过如果预览窗口打开的话,就在激活时先激活该预览窗口,好像也不行。
 
我试了一下,打开模式窗口的时候主窗口可以弹出,但是模式窗口没有恢复,主窗口在
死锁状态,我用以下方法解决。不是很好,但没有想出其他方法


Application.Restore;
ShowWindow(MainForm.Handle,SW_RESTORE);
SetForegroundWindow(MainForm.Handle);
if AboutBox.Handle.Visible then begin
ShowWindow(AboutBox.Handle,SW_RESTORE);
SetForegroundWindow(AboutBox.Handle);
end;
 
我刚才做了一会儿试验。
好像在主窗口Restore后sleep一下,再Restore模态窗口能行,如果在主窗口Restore后
直接Restore模态窗口,就有问题。
(窗口Restore即指:
SetForegroundWindow(Form.Handle);
BringWindowToTop(Form.Handle);
Form.WindowStat := wsMinimized;
Form.WindowStat := wsMaximized;

好像一定要做一下窗口最小化和最大话,否则窗口只是在状态栏显现蓝色并闪烁,但
不弹出到前台.

各位大侠伸伸手,看还有什么好办法吗?
 
你加上这句试试
ShowWindow(MainForm.Handle,SW_RESTORE);
 
这个问题在那边已经解决,而且也解释了原因,看这里:
<a href="DispQ.asp?LID=386017">二次运行的问题?</a>
 
关键是 Application 对象的句柄。
 
接受答案了.
 
后退
顶部