1。第一个功能是任务栏隐藏。winform下有个属性showintaskbar。直接改为false即可。
2。第二个功能是添加通知栏图标。有个控件为notifyicon,直接拉过来,添加图标即可。
3。第三个功能,实现类似QQ的隐藏窗体,把窗体拖到屏幕上方就会缩起来的效果。首先拉一个时钟,设置时间间隔为300毫秒,在时钟里面添加代码:
if (this.Top < 3)
{
if (this.Handle == FormNameAt(Cursor.Position.X, Cursor.Position.Y))
{
this.Top = 0;//使窗体致顶
}
else
{
this.Top = -(this.Height - 2);
}
}
其他相关函数如下:
//获取当前鼠标下可视化控件的句柄
[DllImport("user32.dll")]
public static extern int WindowFromPoint(int xPoint, int yPoint);
//获取指定句柄的父级句柄
[DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
public static extern IntPtr GetParent(IntPtr hWnd);
public IntPtr FormNameAt(int x, int y)
{
IntPtr Tem_hWnd;//设置存储句柄的变量
IntPtr Tem_Handle = (IntPtr)(WindowFromPoint(x, y));
Tem_hWnd = Tem_Handle;//记录原始句柄
while (Tem_hWnd != ((IntPtr)0))
{
Tem_Handle = Tem_hWnd;
Tem_hWnd = GetParent(Tem_hWnd);
}
return Tem_Handle;
}
运行程序,可以发现窗体拉上去可以隐藏了,而且鼠标移到上面的时候弹出来,而且不会缩回去。
4。接下来的功能就是要实现最小化后通知栏鼠标双击的时候恢复窗体的效果。给notifyicon添加双击事件,添加如下代码
this.Visible = true;
this.WindowState = FormWindowState.Normal;
而实际上我们发现,最小化的时候,窗体并没有完全隐藏,而是所在左下角的地方,因此我们需要多做一个操作,添加窗体的Deactivate事件,添加如下代码
if (this.WindowState == FormWindowState.Minimized)
{
this.Visible = false;
}
也就可以明白为什么上面要添加
this.Visible = true;了。
5。最后实现通知栏图标右键的功能,拖一个contextmenustrip控件即可,其操作跟菜单一致。然后在notifyicon中
contextmenustrip
属性添加上刚才拉进来的控件就行啦~~
6。获取窗体最小化 最大化 关闭事件
-
const int WM_SYSCOMMAND = 0x112;
-
const int SC_CLOSE = 0xF060;
-
const int SC_MINIMIZE = 0xF020;
-
const int SC_MAXIMIZE = 0xF030;
-
/// <summary>
-
/// 重写窗体事件
-
/// </summary>
-
/// <param name="m"></param>
-
protected override void WndProc(ref Message m)
-
{
-
if (m.Msg == WM_SYSCOMMAND)
-
{
-
if (m.WParam.ToInt32() == SC_MINIMIZE) //是否点击最小化
-
{
-
//这里写操作代码
-
this.Visible = false; //隐藏窗体
-
return;
-
}
-
if (m.WParam.ToInt32() == SC_MAXIMIZE)
-
{
-
//.....................
-
}
-
if (m.WParam.ToInt32() == SC_CLOSE)
-
{ //.....................}
-
}
-
}
-
base.WndProc( ref m);
-
-
}
-