Windows 7 VB6应用程序出现问题,将对话框置于前端并将焦点放在Windows 7上

Windows 7 VB6应用程序出现问题,将对话框置于前端并将焦点放在Windows 7上,windows-7,com,vb6,activex,Windows 7,Com,Vb6,Activex,我有一个用VisualBasic6编写的小型实用程序应用程序,多年来一直在XP客户端上愉快地运行,直到最近,一个使用Windows7的客户端通知我,并向我展示了不同的行为 当我的VB应用程序显示该对话框时,它将保持隐藏状态,直到用户在任务栏中单击它 我更改了代码,因此没有使用“.show vbModal”命令,而是改为使用非modally显示表单,然后添加了各种API调用,如BringWindowToFront和SetWindowPos,使其成为最顶级的函数并进行调用。关注表单,尽管有这些额外的

我有一个用VisualBasic6编写的小型实用程序应用程序,多年来一直在XP客户端上愉快地运行,直到最近,一个使用Windows7的客户端通知我,并向我展示了不同的行为

当我的VB应用程序显示该对话框时,它将保持隐藏状态,直到用户在任务栏中单击它

我更改了代码,因此没有使用“.show vbModal”命令,而是改为使用非modally显示表单,然后添加了各种API调用,如BringWindowToFront和SetWindowPos,使其成为最顶级的函数并进行调用。关注表单,尽管有这些额外的说明,我能达到的最佳效果是使表单闪烁,提示用户点击它

无论我做了什么尝试,我都无法在没有用户干预的情况下使窗口显示在最顶部,并具有焦点

注意。这是一个ActiveX exe项目,由Win16应用程序通过COM调用

是否有其他人遇到这种行为并知道解决方案

感谢您的建议。

应用程序无法(不向Windows撒谎)窃取焦点。调用应用程序应该真正调用(如果在win16上可用)以允许COM进程窃取焦点,或者调用自身


有关设置焦点的条件,请参阅
setforegroundindow()
的帮助。

是的,我在其他地方读到了关于“allowsetforegroundindow()”的内容,并怀疑这可能是原因。不幸的是,我无法访问进程ID,因为我们只是使用COM指令创建activex对象,例如DIM obj as object,SET obj=CREATEOBJECT(“x.x”),我将尝试SetForegroundWindow()方法,看看是否有帮助。您可以添加一个方法来获取调用程序中的进程ID/窗口句柄,或者通过传递
ASFW_ANY
来全局解锁它。我自己使用32位客户端(另一个VB6程序)创建了一个测试用例。在XP或Vista上一切正常,但ZOrder问题发生在Win7(测试SP1)中。甚至AllowSetForegroundWindow()也没有什么区别,我确认我是从ActiveX EXE的进程调用它的。呃,需要从已经有焦点的进程调用它。如果一个没有焦点的随机应用程序可以允许自己这样做,那就有点傻了。为什么是-1呢?这个问题还有什么不清楚的地方?值得注意的是,16位应用程序不会在64位Windows上运行,因此您可能希望尽快对其进行更新。但是,您仍然可以在32位VM中运行它们。我相信“XP模式”是32位的XP SP3。啊,可能,我从来没有运行过XP模式。这还不足以成为继续运行16位代码的理由:)我假设如果移植16位代码是一个简单的解决方案,那么现在就可以完成了。我不认为XP模式是一个“解决方案”,而只是一个“直到完成”的答案。