如何用C#做一个悬浮窗口程序

C#做一个像FlashGet的悬浮窗口,其实很简单,不像以前需要调用很多系统API。大致的步骤如下。

 

首先是主窗体部分,即要判断窗体的状态来决定是否显示悬浮窗口。

局部成员声明:

1 private FormWindowState fwsPrevious;
2 
3     private frmTopMost myTopMost;

主窗体的Load事件:

 1   private void frmMain_Load(object sender, System.EventArgs e)
 2 
 3     {
 4 
 5         // Save window state
 6 
 7         fwsPrevious = this.WindowState;
 8 
 9  
10 
11         // Create top most window
12 
13         myTopMost = new frmTopMost( this );
14 
15     }

    主窗体的SizeChanged事件:

 1 private void frmMain_SizeChanged(object sender, System.EventArgs e)
 2 
 3     {
 4 
 5         if( this.WindowState == FormWindowState.Minimized )
 6 
 7         {
 8 
 9             // Window minimized
10 
11             // Show top most window
12 
13             myTopMost.Show();
14 
15             this.ShowInTaskbar = false;
16 
17         }
18 
19         else if( this.WindowState != fwsPrevious )
20 
21         {
22 
23             // Save current window state
24 
25             fwsPrevious = this.WindowState;
26 
27         }
28 
29     }
30 
31  

       然后,就是还原窗口方法,即供悬浮窗口进行调用的。

 1   /// <summary>
 2 
 3     /// Restore window state
 4 
 5     /// </summary>
 6 
 7     public void RestoreWindow()
 8 
 9     {
10 
11         this.WindowState = fwsPrevious;
12 
13         this.ShowInTaskbar = true;
14 
15     }

       下来就是悬浮窗口部分代码,首先要设置其窗体的FormBorderStyleNone,然后设置其的TopMosttrue,接下来,就是主要是三个鼠标事件的处理,以下,具体说明如何实现的。

       局部成员声明。

1  private Point ptMouseCurrrnetPos, ptMouseNewPos,
2 
3         ptFormPos, ptFormNewPos;
4 
5     private bool blnMouseDown=false;
6 
7     private frmMain pParent;
8 
9  

       悬浮窗口的构造函数。

 1 public frmTopMost( frmMain pMain )
 2 
 3     {
 4 
 5         //
 6 
 7         // Required for Windows Form Designer support
 8 
 9         //
10 
11         InitializeComponent();
12 
13  
14 
15         // Init main window object
16 
17         pParent = pMain;
18 
19     }
20 
21  
22 
23     悬浮窗口的Load事件。
24 
25     private void frmTopMost_Load(object sender, System.EventArgs e)
26 
27     {
28 
29         this.Show();
30 
31  
32 
33         // Init window size and position
34 
35         this.Top = 100;
36 
37         this.Left = Screen.PrimaryScreen.Bounds.Width - 100;
38 
39         this.Width = 80;
40 
41         this.Height = 80;
42 
43     }

       主要的三个鼠标事件,即MouseDown MouseMove MouseUp三个事件。

 1  private void frmTopMost_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
 2 
 3     {
 4 
 5         if( blnMouseDown )
 6 
 7         {
 8 
 9             //Get the current position of the mouse in the screen
10 
11             ptMouseNewPos = Control.MousePosition;
12 
13  
14 
15             //Set window position
16 
17             ptFormNewPos.X = ptMouseNewPos.X - ptMouseCurrrnetPos.X + ptFormPos.X;
18 
19             ptFormNewPos.Y = ptMouseNewPos.Y - ptMouseCurrrnetPos.Y + ptFormPos.Y;
20 
21  
22 
23             //Save window position
24 
25             Location = ptFormNewPos;
26 
27             ptFormPos = ptFormNewPos;
28 
29  
30 
31             //Save mouse position
32 
33             ptMouseCurrrnetPos = ptMouseNewPos;
34 
35         }      
36 
37     }
38 
39     private void frmTopMost_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
40 
41     {
42 
43         if(e.Button==MouseButtons.Left)
44 
45         {
46 
47             blnMouseDown = true;
48 
49  
50 
51             // Save window position and mouse position
52 
53             ptMouseCurrrnetPos = Control.MousePosition;
54 
55             ptFormPos = Location;
56 
57         }
58 
59     }
60 
61     private void frmTopMost_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
62 
63     {
64 
65         if( e.Button == MouseButtons.Left)
66 
67             //Return back signal
68 
69             blnMouseDown = false;
70 
71     }
72 
73  

 

    然后就是双击悬浮窗体,进行恢复主窗体。

 1 private void frmTopMost_DoubleClick(object sender, System.EventArgs e)
 2 
 3     {
 4 
 5         SwitchToMain();
 6 
 7     }
 8 
 9     private void SwitchToMain()
10 
11     {
12 
13         //Change main window status here
14 
15         pParent.RestoreWindow();
16 
17         //Hide top most window
18 
19         this.Hide();
20 
21     }
22 
23  

 

    此外,还可以给悬浮窗口添加ContextMenu,来辅助操作,这里就不细说了。

  

 1  private System.Windows.Forms.ContextMenu mnuPopup;
 2 
 3     private System.Windows.Forms.MenuItem mnuMainWindow;
 4 
 5     private System.Windows.Forms.MenuItem mnuExit;
 6 
 7     private void mnuMainWindow_Click(object sender, System.EventArgs e)
 8 
 9     {
10 
11         SwitchToMain();
12 
13     }
14 
15  
16 
17     private void mnuExit_Click(object sender, System.EventArgs e)
18 
19     {
20 
21         Application.Exit();
22 
23     }

 

posted @ 2013-02-28 10:55  Net-Spider  阅读(962)  评论(0)    收藏  举报