【问题标题】:Detect and Prevent Overlapping Windows in C#在 C# 中检测和防止重叠窗口
【发布时间】:2009-11-05 22:03:47
【问题描述】:

有人知道一种有效检测当前在 Windows 系统上打开的任何窗口的移动的方法吗?我需要检测一个窗口的移动,确定它是否与我的应用程序窗体发生碰撞,并在必要时将其从下方撞出。

我知道我可以扫描一个枚举列表并检查每个窗口——但这是一种持续执行的密集方式。

背景:

我有一个停靠在用户屏幕一侧的任务栏式应用程序。当“始终在顶部”功能打开时,最大化的窗口将占用剩余的可用空间,而不会像预期的那样覆盖工具栏。

但是,如果您将一个未最大化的窗口拖到工具栏上,应用程序会移到工具栏后面(也是预期的),但您不能再抓住标题栏将其移回 - 除非您禁用“始终在顶部”,然后移动它。所以,我想把窗户从下面撞出去。

【问题讨论】:

  • 注意:用户可以随时使用键盘将其移出:ALT+SPACE、M、右箭头(或任何箭头键),然后窗口跟随鼠标。
  • @jeffamaphone:虽然没有多少用户知道这一点
  • 当然,用户可以......但他们也会非常直言不讳地表示不赞成这种方法:)

标签: c# winforms


【解决方案1】:

虽然不是直接的答案,但一种可能的解决方案是将应用程序创建为应用程序桌面工具栏而不是常规窗口。来自the docs

应用程序桌面工具栏(也称为应用栏)是类似于 Microsoft Windows 任务栏的窗口。它被锚定在屏幕的边缘...系统会阻止其他应用程序使用应用栏占用的桌面区域(强调)

这可能不太适合您的方案,因为它面向 COM 和非托管代码而不是托管应用程序:但是请参阅 this CodeProject article 了解有关从 C# 使用此功能的信息。

如果做不到这一点,您可以尝试安装一个钩子(请参阅 SetWindowsHookEx)并监听移动消息,但这是非常低级的......

【讨论】:

  • 感谢您的建议。该应用程序当前已注册为应用程序桌面工具栏,这就是最大化窗口将遵守规则的原因。 Windows 任务栏(另一个应用程序桌面工具栏)实际上与我的问题相同 - 将您的任务栏移动到屏幕顶部并将其设置为“始终位于顶部”。然后将另一个窗口拖到它上面,使整个标题栏在任务栏上,并且您不能再移动该窗口。例外情况是在 Windows 7 中,Windows 任务栏具有我想要的行为,并且会弹出窗口。
  • 我会尝试 SetWindowsHookEx 的想法,看看它是否能解决问题。我不担心低级,只要它在不占用太多资源的情况下工作。
【解决方案2】:

尝试检查您的 PaintEventArgs ClipRectangle ..

(编辑:和/或 WindowFromPoint 射击匹配)

【讨论】:

  • 我认为他想移动一个他不拥有的窗口,而不是他拥有的。
  • Jeffamaphone 是正确的——我希望检测应用程序外部的重叠窗口。
【解决方案3】:

您可以使用 CBT Hook 获取窗口移动通知:http://msdn.microsoft.com/en-us/library/ms644977(VS.85).aspx

【讨论】:

  • 我已经把它连接起来了,它看起来应该可以工作——但目前我只能得到它来为我的应用程序拥有的窗口移动提供反馈。如果我能得到这个给我系统上任何窗口的回调,我们就在做生意!
  • 根据support.microsoft.com/default.aspx/kb/318804 和其他各种来源,如果不在 C++ DLL 中实现它们,就无法从 .NET 应用程序(除了那些监视键盘/鼠标移动的应用程序)创建全局窗口挂钩。 . 我想我会开始研究这个,因为这似乎是我唯一的选择。
【解决方案4】:

http://www.codeproject.com/KB/dialog/FindWindow.aspx?msg=3262771

“查找窗口,约尔格·鲍什”

将为您获取鼠标从 C# 应用程序中移过的外部(不是您的应用程序的)窗口 ID (IntPtr)。对于桌面以及桌面上的其他所有内容,它将返回相同的指针(使用此代码,您无法区分文件夹、桌面、回收站)。

http://www.codeproject.com/KB/cs/globalhook.aspx

“在 C# 中处理全局鼠标和键盘挂钩,George Mamaladze”

将允许您在 C# 中为键盘和鼠标事件创建 GlobalHook。我最近在 VS 2010 beta 2 中使用过它:它不能针对 FrameWork 4.0 进行编译,但可以针对 FrameWork 3.5 及更低版本进行编译和工作。如果您只下载 George 的演示应用程序,请注意下载不包含所需的 dll,并且在您启动 .exe 文件时会失败(我已提请 George 注意)。

我从未使用过“桌面应用程序工具栏”;我希望这是相关的。

最好的,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 2022-10-20
    相关资源
    最近更新 更多