繁体   English   中英

将表格保留在任务栏上方?

[英]Keep my form above the taskbar?

我的总体目标是渲染第二个(或第三,第四...)鼠标光标。 为此,我创建了一个无框,最顶部的透明窗口。 我可以在此窗口上绘制(上面有4个按钮,以显示它正确地覆盖了整个桌面)-但是,当我单击任务栏时,它被带到顶部并覆盖我的按钮和绘制的线条。

如何将窗口保持在任务栏上方

另外,有什么方法可以在屏幕的“最终”版本上绘制?

这是我的.Designer.cs文件中的代码:

this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
this.BackColor = System.Drawing.Color.White;
this.CausesValidation = false;
this.ClientSize = new System.Drawing.Size(332, 332);
this.ControlBox = false;
this.Controls.Add(this.button4);
this.Controls.Add(this.button3);
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "Screen";
this.ShowIcon = false;
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
this.StartPosition = System.Windows.Forms.FormStartPosition.WindowsDefaultBounds;
this.TopMost = true;
this.TransparencyKey = System.Drawing.Color.White;

在没有分析执行此操作的确切动机以及该方法是否是最佳方法的情况下,您应注意,任务栏的行为等同于任何其他窗口之一:可以不受限制地使用TopMost 另一方面,它被视为在“ WorkingArea”之外,因此,根据您使用的属性,它可能会被忽略。 请看下面的示例代码,以更好地理解这一点。

Main Form覆盖任务栏上方的所有可用空间:

this.ClientSize = new System.Drawing.Size(Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height);
this.Location = new Point(Screen.PrimaryScreen.WorkingArea.Left, Screen.PrimaryScreen.WorkingArea.Top);

Main Form覆盖屏幕的整个可用空间:

this.ClientSize = new System.Drawing.Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
this.Location = new Point(Screen.PrimaryScreen.WorkingArea.Left, Screen.PrimaryScreen.WorkingArea.Top);

因此,您可以记住WorkingArea代表工作WorkingArea和屏幕Bounds之间的差异,从而可以将窗体毫无问题地放在任务栏的顶部。

澄清:此答案突出显示了为什么任务栏与屏幕的其他任何部分都不同的原因。 这并不意味着您必须使窗体与整个屏幕一样大才能将其放在任务栏上。 您可以随时根据需要将其放在任务栏上,并使其尺寸尽可能小。 您要记住的是, WorkingArea不能提供屏幕的整个尺寸,而只能提供任务栏上方的区域。 如果要考虑任务栏,请考虑Bounds

我会使用varocarbas的答案,但是我想补充一些我认为可能有用的东西。

有几件事情是没有办法,我想可能是有帮助的,当我读到你的问题袭击我脑海的第一个想法是创建一个GlobalHook监测信息WM_CBT ,此消息被发送给GlobalHook程序时,系统将要Maximize,Minimize,Restore or Focus窗口。当捕获任何钩子时,您可以覆盖任何必需的事件以阻止该窗口成为最顶层的窗口,从而使your Form保留最顶层的窗口的机会。我期待着。

如果您对此感兴趣,这里是使GlobalHook工作所需的方法。 SetWindowsHookEx() ,用于告诉系统创建GlobalHook。
HookProc ,表示当钩子捕获受监视事件时调用的方法。
HookType ,枚举传递给SetWindowsHookEx调用的有效钩子类型。
CallNextHook 。如果使用的互操作性是凌乱的,试试这个包含在管理wrapper.Hope这可以帮助你的WindowsAPI功能的开源库,同时我也想获得的东西为你工作。

我已经为这个问题苦了几个小时。 我想到了一个不错的解决方案:只要最大化表单,就可以动态更改表单的底部填充。

If Me.WindowState = FormWindowState.Maximized then
    Dim pd As New Padding
    pd.Left = Me.Padding.Left
    pd.Right = Me.Padding.Right
    pd.Top = Me.Padding.Top
    pd.Bottom = Me.Height - Screen.PrimaryScreen.WorkingArea.Height
    Me.Padding = pd
end if

这样,窗体不在任务栏上方,但是至少您的控件在上方! 注意:在设计表单时,您可以保留底部填充0。如果您希望表单能够最小化/正常调整大小,则可能需要在另一个表单事件中将底部填充重置为0。

我实际上在发布后约15分钟找到了解决方案。 (这并不总是这样吗?要花几个小时进行研究,但是一旦您寻求帮助,就可以自行解决。:)

我有一个事件正在使用位置更新调用我的代码。 如果我在此事件中简单地调用“ BringToFront”,则效果很好。 该事件每秒被调用很多次,但是如果我将行为降低到1/4秒,它仍然可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM