【问题标题】:How to detect windows8.1 start menu?如何检测 Windows 8.1 开始菜单?
【发布时间】:2016-01-11 09:26:41
【问题描述】:

当我们在 Windows 8.1 上按下开始菜单时,它会以磁贴的形式显示所有新的开始菜单,其中包含应用程序。此菜单显示在整个屏幕上。有没有办法检测这个菜单是否在 C++ 中打开。在 8.1 SDK 中是否有一个 winAPI 可以这样做。

提前致谢。

【问题讨论】:

  • 几乎没有理由知道。通常,应用程序只对前台激活消息感兴趣,而不关心哪个应用程序负责(尽管WM_ACTIVATEAPPlParam 提供了此信息)。为什么你必须知道?

标签: c++ winapi visual-c++ microsoft-metro windows-8.1


【解决方案1】:

我不确定是否存在专门的 WinAPI 调用,但您可以在开始菜单打开和关闭的情况下运行 EnumWindows 以确定窗口句柄,然后检查其类和其他参数 - 如果您这样做知道如何识别它,您总是可以在程序中执行相同的逻辑 - 枚举窗口,找到开始菜单的句柄,检查它是否可见。

【讨论】:

  • Windows 8.1 开始菜单/启动器未在通过 EnumWindows 找到的窗口中列出。
【解决方案2】:

调用 CoCreateInstance(CLSID_AppVisibility,...) 获取实现IAppVisibility 的对象,然后调用 IAppVisibility::IsLauncherVisible 查看开始菜单是否可见。

这在Start screen visibility sample中得到了证明

【讨论】:

  • 我在上面提供了一个 C sn-p 但我认为这是 C++ 的最佳答案,在 C 编程中可以使用 COM 对象但有点复杂(工作量太大)
【解决方案3】:

你必须使用钩子,一个特殊的shell钩子https://msdn.microsoft.com/en-us/library/windows/desktop/ms644991%28v=vs.85%29.aspx,然后在HSHELL_WINDOWACTIVATED事件上检查返回的GetForegroundWindow()的ClassName

【讨论】:

  • 没有比@Rob Caplan - MSFT 更好的主意了。对没有评论的人投反对票根本无济于事。
  • 感谢@milevyo 的回复。我会试试这个,让你知道结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
相关资源
最近更新 更多