【问题标题】:Trouble with VB6 app, bringing a dialog to front and focus on Windows 7VB6 应用程序出现问题,将对话框置于前面并专注于 Windows 7
【发布时间】:2012-06-05 14:48:40
【问题描述】:

我有一个用 Visual Basic 6 编写的小型实用程序应用程序,多年来一直在 XP 客户端上愉快地运行,直到最近一个使用 Windows 7 的客户端通知我,并告诉我行为不同。

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

我更改了代码,而不是使用“.show vbModal”命令,而是改为以非模态方式显示表单,然后添加了各种 API 调用,如 BringWindowToFront 和 SetWindowPos 以使其成为最重要的并调用 .focus on表单,尽管有这些额外的说明,但我能达到的最佳结果是让表单闪烁,提示用户单击它。

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

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

有没有其他人遇到过这种行为并知道解决方案?

任何建议/建议表示赞赏,谢谢。

【问题讨论】:

  • 为什么是 -1 ?这个问题有什么不清楚的地方?
  • 请记住,16 位应用程序无法在 64 位 Windows 上运行,因此您可能希望尽快更新它。
  • 但是您仍然可以在 32 位 VM 中运行它们。我相信“XP 模式”是 32 位 XP SP3。
  • 啊,可能我从来不用运行 XP 模式。不过,这还不足以成为继续运行 16 位代码的充分理由 :)
  • 我假设如果移植 16 位代码是一个简单的解决方案,那么现在就可以完成了。我不认为 XP Mode 是一个“解决方案”,只是一个“做得到”的答案。

标签: windows-7 com vb6 activex


【解决方案1】:

应用程序不能(不欺骗 Windows)窃取焦点。调用应用程序应该真正调用AllowSetForegroundWindow()(如果它在win16 上可用)以允许COM 进程窃取焦点,或者调用SetForegroundWindow() 本身。

设置焦点的条件见SetForegroundWindow()的帮助。

【讨论】:

  • 是的,我在其他地方读到了“AllowSetForegroundWindow()”,并怀疑这可能是原因。不幸的是,我无法访问进程 ID,因为我们只是使用 COM 指令创建 activex 对象,例如 DIM obj as Object, SET obj = CREATEOBJECT("x.x")
  • 我会尝试 SetForegroundWindow() 方法,看看是否有帮助。
  • 您可以在调用者中添加一个方法来获取进程ID/窗口句柄,或者通过传递ASFW_ANY来全局解锁它
  • 我自己使用 32 位客户端(另一个 VB6 程序)创建了一个测试用例。在 XP 或 Vista 上一切正常,但在 Win7 中出现 ZOrder 问题(已测试 SP1)。甚至 AllowSetForegroundWindow() 也没有什么不同,我确认我是从 ActiveX EXE 的进程中调用它的。
  • 呃,需要从已经有焦点的进程中调用。如果一个没有焦点的随机应用程序允许自己这样做,那就有点傻了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多