我正在制作一个简单的CPU使用情况监视器。该应用程序只是任务栏中的一个图标,它使用Microsoft.WindowsAPICodePack库将任务的CPU使用率显示为图标进度条。
此应用程序目前正常运行。为了增加价值,我想阻止用户打开应用程序的表单,该表单是空白的。目前我正在使用以下代码:
/// <summary>
/// Forces this window to remain minimized.
/// </summary>
private void MainForm_SizeChanged(object sender, EventArgs e)
{
if (WindowState != FormWindowState.Minimized)
WindowState = FormWindowState.Minimized;
}
这会导致表单在屏幕上瞬间闪烁并缩小回任务栏。当点击图标时,我宁愿没有任何明显的事情发生。有没有办法实现这个目标?
尝试1
按照 deathismyfriend的建议,我试图隐藏表单。 WindowsAPICodePack抛出异常:
更新任务栏需要有效的活动窗口。
尝试2
设置this.Opacity = 0
并不常用。有趣的是,表格是透明的...直到你最小化它。然后它出现并收缩到任务栏。
答案 0 :(得分:3)
这对我有用。陷阱WM_SYSCOMMAND并禁止SC_RESTORE / SC_MAXIMIZE:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.Opacity = 0; // prevent ALT-TAB preview
this.WindowState = FormWindowState.Minimized;
}
protected override void WndProc(ref Message m)
{
const int WM_SYSCOMMAND = 0x0112;
const int SC_RESTORE = 0xF120;
const int SC_MAXIMIZE = 0xF030;
if ((m.Msg == WM_SYSCOMMAND) && ((int)m.WParam == SC_RESTORE || (int)m.WParam == SC_MAXIMIZE))
{
return;
}
base.WndProc(ref m);
}
}
*将Opacity()设置为0(零)确实阻止了Alt-Tab预览窗口。
答案 1 :(得分:1)
您违反Windows界面标准才能执行此操作。这就是为什么它很难。系统托盘是为此类应用程序而构建的。您仍然可以在系统托盘中为图标设置动画以显示此类信息。这是另一个有助于系统托盘的问题:
How can I make a .NET Windows Forms application that only runs in the System Tray?
答案 2 :(得分:1)
仍然不优雅,但您可以将FormBorderStyle
设置为FormBorderStyle.None
,以防止在航空中的窗口预览上右键单击上下文菜单,然后将表单移出屏幕:
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
Location = new Point(int.MinValue, int.MinValue);
}
答案 3 :(得分:0)
将不透明度设置为1并将窗口置于屏幕外位置。表单仍然会闪烁,但对用户来说是不可见的。