【问题标题】:SetProgressValue() not working within ConEmuSetProgressValue() 在 ConEmu 中不起作用
【发布时间】:2017-10-17 21:43:45
【问题描述】:

我们开发了一个控制台应用程序,它使用ITaskbarList3::SetProgressValue() 方法,在 cmd.exe 中调用该应用程序时可以正常工作,但在Conemu 控制台中调用时它没有显示任何进度。任何地方都不会出现错误消息。作为ITaskbarList3::SetProgressValue() 的参数传递的HWND 是这样的:

HWND hwnd = GetConsoleWindow();

我没有要显示的代码,因为我不知道执行此操作的替代方法或可能出现的问题。我认为返回的 HWND 可能是 conemu 的,而不是我的应用程序的,所以我调用了 GetWindowText() 函数来检查窗口的文本是否不是我的控制台应用程序,但它是一个与 cmd 格式相同的字符串。

【问题讨论】:

  • 您确定您使用的HWND 与任务栏上实际显示的HWND 相同吗?您不能随便使用任何HWND。而且您当然不拥有控制台窗口。您可能需要让您的控制台应用程序显示其自己的弹出 GUI 窗口以获取进度,然后为该窗口设置任务栏进度
  • 如何确保我使用的 HWND 与任务栏上显示的相同?任何Windows工具?它确实适用于 cmd.exe 问题出在 Conemu 上。也许在使用 Conemu 时它会返回 conemu 的句柄而不是我的应用程序的句柄?
  • Windows 对 Conemu 一无所知。 GetConsoleWindow() 返回 Windows 自己的控制台窗口的 HWND,而不是 Conemu 的窗口。 Conemu 通过连接到 Windows 控制台系统来完成它的工作,但它并没有完全取代那个系统。对于您尝试做的事情,您可能需要 Conemu 的 HWND。尝试使用FindWindow()EnumWindows() 找到它。
  • @RemyLebeau 感谢您的解释!我在想GetConsoleWindow() 会返回当前使用的控制台的 HWND,即调用应用程序的控制台,在这种情况下是 ConEmu。

标签: c++ winapi progress-bar taskbar conemu


【解决方案1】:

当您在 ConEmu 中运行控制台应用程序时,GetConsoleWindow() 返回虚拟控制台 HWND 而不是本机控制台 HWND。然而,两者都发送适合SetProgressValue(),因为虚拟控制台是 ConEmu 的子窗口(显示在任务栏上)并且 conhost HWND 甚至不可见。

在调用 SetProgressValue() 之前获取 GetConsoleWindow() 的父级。

【讨论】:

  • 根据来自GetWindowText() 的标题,似乎HWND 适用于SetProgressValue(),但由于某种原因它不适用于ConEmu。另一方面,GetParent() 返回的从 HWND 获得的窗口标题是空的......我错过了什么?
  • 为什么你认为这个标题是合适的标志?这还不够。
  • 从 Visual Studio 运行 Spy 以检查窗口。您应使用任务栏上显示的“根级别”窗口。
  • 谢谢! GetAncestor(GetConsoleWindow(), GA_ROOT)做到了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 2012-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
相关资源
最近更新 更多