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

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

局部成员声明:

private FormWindowState fwsPrevious;

private frmTopMost myTopMost;

主窗体的Load事件:

private void frmMain_Load(object sender, System.EventArgs e)

{

// Save window state

fwsPrevious = this.WindowState;

// Create top most window

myTopMost = new frmTopMost( this );

}

主窗体的SizeChanged事件:

private void frmMain_SizeChanged(object sender, System.EventArgs e)

{

if( this.WindowState == FormWindowState.Minimized )

{

// Window minimized

// Show top most window

myTopMost.Show();

this.ShowInTaskbar = false;

}

else if( this.WindowState != fwsPrevious )

{

// Save current window state

fwsPrevious = this.WindowState;

}

}

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

/// <summary>

/// Restore window state

/// </summary>

public void RestoreWindow()

{

this.WindowState = fwsPrevious;

this.ShowInTaskbar = true;

}

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

局部成员声明。

private Point ptMouseCurrrnetPos, ptMouseNewPos,

ptFormPos, ptFormNewPos;

private bool blnMouseDown=false;

private frmMain pParent;

悬浮窗口的构造函数。

public frmTopMost( frmMain pMain )

{

//

// Required for Windows Form Designer support

//

InitializeComponent();

// Init main window object

pParent = pMain;

}

悬浮窗口的Load事件。

private void frmTopMost_Load(object sender, System.EventArgs e)

{

this.Show();

// Init window size and position

this.Top = 100;

this.Left = Screen.PrimaryScreen.Bounds.Width - 100;

this.Width = 80;

this.Height = 80;

}

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

private void frmTopMost_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)

{

if( blnMouseDown )

{

//Get the current position of the mouse in the screen

ptMouseNewPos = Control.MousePosition;

//Set window position

ptFormNewPos.X = ptMouseNewPos.X - ptMouseCurrrnetPos.X + ptFormPos.X;

ptFormNewPos.Y = ptMouseNewPos.Y - ptMouseCurrrnetPos.Y + ptFormPos.Y;

//Save window position

Location = ptFormNewPos;

ptFormPos = ptFormNewPos;

//Save mouse position

ptMouseCurrrnetPos = ptMouseNewPos;

}

}

private void frmTopMost_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)

{

if(e.Button==MouseButtons.Left)

{

blnMouseDown = true;

// Save window position and mouse position

ptMouseCurrrnetPos = Control.MousePosition;

ptFormPos = Location;

}

}

private void frmTopMost_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)

{

if( e.Button == MouseButtons.Left)

//Return back signal

blnMouseDown = false;

}

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

private void frmTopMost_DoubleClick(object sender, System.EventArgs e)

{

SwitchToMain();

}

private void SwitchToMain()

{

//Change main window status here

pParent.RestoreWindow();

//Hide top most window

this.Hide();

}

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

private System.Windows.Forms.ContextMenu mnuPopup;

private System.Windows.Forms.MenuItem mnuMainWindow;

private System.Windows.Forms.MenuItem mnuExit;

private void mnuMainWindow_Click(object sender, System.EventArgs e)

{

SwitchToMain();

}

private void mnuExit_Click(object sender, System.EventArgs e)

{

Application.Exit();

}

如何用C#做一个悬浮窗口程序的更多相关文章

  1. fir.im Weekly - 如何做一个出色的程序员

    做一个出色的程序员,困难而高尚.本期 fir.im Weekly 精选了一些实用的 iOS,Android 开发工具和源码分享,还有一些关于程序员的成长 Tips 和有意思有质量的线下活动~ How ...

  2. 【CSS】如何用css做一个爱心

    摘要:HTML的标签都比较简单,入门非常的迅速,但是CSS是一个需要我们深度挖掘的东西,里面的很多样式属性掌握几个常用的便可以实现很好看的效果,下面我便教大家如何用CSS做一个爱心. 前期预备知识: ...

  3. 做一个懒COCOS2D-X程序猿(一)停止手打所有cpp文件到android.mk

    前言:”懒”在这里当然不是贬义词,而是追求高效,拒绝重复劳动的代名词!做一个懒COCOS2D-X程序猿的系列文章将教会大家在工作中如何偷懒,文章篇幅大多较短,有的甚至只是几行代码,争取把懒发挥到极致! ...

  4. 如何用css做一个爱心

    摘要:HTML的标签都比较简单,入门非常的迅速,但是CSS是一个需要我们深度挖掘的东西,里面的很多样式属性掌握几个常用的便可以实现很好看的效果,下面我便教大家如何用CSS做一个爱心. 前期预备知识: ...

  5. NetAnalyzer笔记 之 三. 用C++做一个抓包程序

    [创建时间:2015-08-27 22:15:17] NetAnalyzer下载地址 经过前两篇的瞎扯,你是不是已经厌倦了呢,那么这篇让我们来点有意思的吧,什么,用C#.不,这篇我们先来C++的 Wi ...

  6. Micropython 如何用Turnipbit做一个自动浇水装置

    最近在研究Turnipbit这块板子,打算是连接一个摄像头模块,正在实验练习中,(祝自己早日弄好)上篇文章我们讲了用Turnipbit连接LCD5110显示英文词句,前几天给家里花浇水的时候发现花招了 ...

  7. 用pyqt5做一个能python程序能插入图片的ide

    之前只是放到github上了,现在一想应该开源,大家想继续做好这个ide的都能从这里起步. #注意在.py文件相同目录下放一个1.png做测试图片 #本质就是用html来实现图片 #写在前面的话:这个 ...

  8. 我的第一个 Windows 窗口程序(1)

    一般来说,构建一个 Windows 程序可以分为如下几个步骤: 定义窗口类(WNDCLASS) 注册窗口类(RegisterClass) 创建窗口(CreateWindow) 更新显示窗口(Updat ...

  9. 使用python做一个爬虫GUI程序

    整体思路和之前的一篇博客爬虫豆瓣美女一致,这次加入了图片分类,同时利用tkinter模块做成GUI程序 效果如下: 整体代码如下: # -*- coding:utf-8 -*- import requ ...

随机推荐

  1. Eclipse配置Struts2问题:ClassNotFoundException: org...dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

    我的解决方案 一开始,我是依照某本教材,配置了User Libraries(名为struts-2.2.3, 可供多个项目多次使用), 然后直接把struts-2.2.3引入过来(这个包不会真正的放在项 ...

  2. Linux X86-64 进程内存空间布局

    http://blog.csdn.net/woshinia/article/details/41722085 http://www.lenky.info/archives/2012/04/1424 h ...

  3. linux 清空catalina.out日志 不需要重启tomcat

    # cd /usr/local/tomcat8.0/logs/ # echo "" > catalina.out

  4. (转)h264中avc和flv数据的解析

    计算 AVCDecoderConfigurationRecord  得到 CodecPrivateData 数据(只有第一帧需要): 计算 NALUs 得到帧数据. 计算 AVCDecoderConf ...

  5. 简单的后台管理系统vue-cli3.0+element-ui

    前段时间在研究一个分发系统,发现vue-cli+element-ui好像是挺不错的,然后自己根据那个分发系统尝试搭建了一下 1.首先安装vue和vue-cli // 全局安装vue npm insta ...

  6. 《Hadoop应用开发技术详解》

    <Hadoop应用开发技术详解> 基本信息 作者: 刘刚 丛书名: 大数据技术丛书 出版社:机械工业出版社 ISBN:9787111452447 上架时间:2014-1-10 出版日期:2 ...

  7. plsql只有注释显示问号,其余中文可以正常显示

    在plsql客户端查看表信息,注释均为乱码,使用select 查询字段中中文字符正常,以下为解决方案: 1.使用语句 select * from V$NLS_PARAMETERS 查询 nls_lan ...

  8. C/C++ 中头文件相互包含引发的问题

    转自:http://blog.csdn.net/hazir/article/details/38600419 今天下午遇到一个头文件相互包含而导致的编译问题,花了我不少时间去调试没找到问题,最后晚上跟 ...

  9. Orchard运用 - 设置网站Favicon标识

    Favicon其实是访问其网站时在浏览器地址栏最前边呈现的类似logo的图标,可以作为品牌的标识,一般是其网站logo的缩小版并一般是ico格式的图片.详细解释可看这里: Favicon - 维基百科 ...

  10. leetcode笔记:First Bad Version

    一. 题目描写叙述 You are a product manager and currently leading a team to develop a new product. Unfortuna ...