如何用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 }
下来就是悬浮窗口部分代码,首先要设置其窗体的FormBorderStyle为None,然后设置其的TopMost为true,接下来,就是主要是三个鼠标事件的处理,以下,具体说明如何实现的。
局部成员声明。
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 }
浙公网安备 33010602011771号