【问题标题】:Can the taskbar moving be detected?可以检测到任务栏的移动吗?
【发布时间】:2012-05-19 03:04:03
【问题描述】:

我有一个类可以访问 win32 API 以获取任务栏的位置、大小、状态和边缘。我使用该类来了解在哪里创建警报,具体取决于任务栏的位置。我有一种方法可以根据任务栏何时生成或删除新警报来更新警报位置。

有没有办法检测任务栏何时移动以便我可以调用更新方法?这样,如果用户移动任务栏,警报就会移动到适当的位置,而不是在一个荒谬的位置,直到出现新警报或删除一个警报。

我的想法是让计时器检查我上次生成的当前任务栏对象,每隔一秒左右使用一个新对象,如果有变化则调用更新方法。我只是想知道是否有“更简单”或“更好”的方法来做到这一点。

(使用 Visual Studio 2010 C#)

TL;DR 需要检测任务栏何时移动以调用方法。

【问题讨论】:

  • 没有。只是不要,用户不会经常移动任务栏。使用 ABM_GETTASKBARPOS Pinvoke SHAppBarMessage() 以找出栏的位置以定位新的警报窗口。如果您想在计时器滴答声中执行此操作,那么这并没有什么问题,只要您不是每毫秒都执行一次。
  • 完成此操作的正确方法是在显示警报之前立即询问任务栏位置。在移动任务栏或使用计时器时收到通知将完全没有必要。
  • 我已经让它在应用程序启动或生成/删除新警报时查看任务栏位置,然后更新警报的位置。我的问题是这个警报系统将很少使用,但警报可能会在用户计算机上的屏幕上保留一段时间,直到问题结束。因此,任务栏移动但警报不移动的可能性可能是人们会抱怨的问题。
  • 在我的情况下不需要轮询。我们有一个应用程序覆盖了大部分屏幕,除了屏幕每个边框上的几个像素。如果鼠标移动到隐藏它的边缘,这个小边框允许显示任务栏。 SHAppBarMessage 将满足我的需要,但我想将其设置为在任务栏移动时触发,无论是取消隐藏、移动到属性中的另一个边缘还是调整大小。简单地说你的普通用户不会定期做这些事情是不可接受的。

标签: c# visual-studio-2010 taskbar


【解决方案1】:

一般的想法,你应该继承任务栏窗口。 正如您现在所看到的,每个窗口都定义了所谓的 WndProc(窗口过程),用于处理系统或其他窗口发送的所有消息。

您不能直接访问此函数,但您可以使用正确的 API (SetWindowLong) 将消息流重定向到您选择的另一个 WndProc 函数(记得回调旧的 WndProc 以便目标窗口函数一般)。

通过这样做,您可以监视目标窗口收到的所有消息。特别是您的 WM_MOVE 消息。

这是一个简单的解释,我建议您仔细阅读。

这是一个起始链接:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633569(v=vs.85).aspx

【讨论】:

  • -1。这是错误的。将任务栏窗口子类化是应避免的最后手段。您为系统中在您之后启动的每个应用程序调用您的函数的开销,并在您的崩溃或由于某种原因出现错误时引入问题。如果您出于某种原因觉得需要子类化系统级 Windproc,那么您可能做错了什么。
  • 调用函数时没有开销这样的事情......这不是一个钩子。我认为你的想法是错误的。
  • 好的。 -1 用于在有更好的解决方案时不必要的子类化。在不需要时更换 WndProc 是错误的。更好的?当您感兴趣的只是可以显示偶尔警报的位置时,您不需要“监视目标窗口收到的所有消息”。您无需捕获发送的数千条窗口消息即可检测很少发生的消息。
  • 您高估了子类化的影响。你会惊讶地知道这个过程使用了多少。无论如何,这不是进行此类讨论的地方:) 是否有更好的解决方案,可能是。这是一个糟糕的解决方案,我不这么认为。但这又是我的看法。
  • 你低估了它。这只是让 Explorer 崩溃的好方法。如果不将代码注入到进程中,您就不能对另一个进程拥有的窗口进行子类化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 2021-04-26
  • 2020-02-20
  • 2011-06-10
相关资源
最近更新 更多