在C#中检测并防止重叠Windows

时间:2009-11-05 22:03:47

标签: c# winforms

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

我知道我可以扫描一个枚举列表并检查每个窗口 - 但这是强化执行的方法。

背景:

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

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

4 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

尝试检查您的PaintEventArgs ClipRectangle ..

(编辑:和/或WindowFromPoint拍摄匹配)

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

“FindWindow作者JörgBausch”

鼠标会从你的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注意)。

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

最好的,