Delphi 在DDE事件后,如何将窗口置于最前面?

Delphi 在DDE事件后,如何将窗口置于最前面?,delphi,focus,show,dde,Delphi,Focus,Show,Dde,在DDE事件中,我的程序加载一个文件,并应弹出到前台。 我在用 show; 只有当我把窗户藏起来的时候,它才像那样工作 所以我补充说 bringtofront; 同样,如果它被隐藏、关闭、最小化或在图标托盘中,但如果它正好在另一个窗口下打开,则不起作用 我甚至试过一些黑客的东西,比如 windowstate:=wsminimized; windowstate:=wsnormal; 试图强迫它表现出来,但没有效果。我知道代码正在运行,因为我在这个块的两侧都有打印输出,并且没有条件语句可能被卡

在DDE事件中,我的程序加载一个文件,并应弹出到前台。 我在用

show;
只有当我把窗户藏起来的时候,它才像那样工作

所以我补充说

bringtofront;
同样,如果它被隐藏、关闭、最小化或在图标托盘中,但如果它正好在另一个窗口下打开,则不起作用

我甚至试过一些黑客的东西,比如

windowstate:=wsminimized;
windowstate:=wsnormal;

试图强迫它表现出来,但没有效果。我知道代码正在运行,因为我在这个块的两侧都有打印输出,并且没有条件语句可能被卡住。

您是否尝试过和/或设置ActiveWindow?另请参见此主题。

SetForegroundWindow并不总是有效。事实上,这些天它不太可能工作,因为应用程序不应该抓住焦点,它们只能把焦点传递出去。多年来,微软一直在努力防止应用程序窃取输入焦点。阅读Raymond Chen对此的评论,了解一些历史

因此,如果你自己是前台应用程序,你可以设置ForeGroundIndow到另一个应用程序,一切都会很美好。如果你不是前台应用,唯一可能发生的事情就是任务栏按钮开始闪烁


更让人困惑的是,确切的行为取决于Windows版本,因此发生的情况取决于您正在运行的Windows类型-他们已经在这方面做了很长时间:-)。

发送DDE事件的程序需要通过调用AllowSetForegroundWindow进行合作。我希望Explorer能做到这一点,但其他程序可能忽略了这个细节。这也是一件好事。我真的不喜欢其他节目占据焦点。