如何用C#做一个悬浮窗口程序
用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#做一个悬浮窗口程序的更多相关文章
- fir.im Weekly - 如何做一个出色的程序员
做一个出色的程序员,困难而高尚.本期 fir.im Weekly 精选了一些实用的 iOS,Android 开发工具和源码分享,还有一些关于程序员的成长 Tips 和有意思有质量的线下活动~ How ...
- 【CSS】如何用css做一个爱心
摘要:HTML的标签都比较简单,入门非常的迅速,但是CSS是一个需要我们深度挖掘的东西,里面的很多样式属性掌握几个常用的便可以实现很好看的效果,下面我便教大家如何用CSS做一个爱心. 前期预备知识: ...
- 做一个懒COCOS2D-X程序猿(一)停止手打所有cpp文件到android.mk
前言:”懒”在这里当然不是贬义词,而是追求高效,拒绝重复劳动的代名词!做一个懒COCOS2D-X程序猿的系列文章将教会大家在工作中如何偷懒,文章篇幅大多较短,有的甚至只是几行代码,争取把懒发挥到极致! ...
- 如何用css做一个爱心
摘要:HTML的标签都比较简单,入门非常的迅速,但是CSS是一个需要我们深度挖掘的东西,里面的很多样式属性掌握几个常用的便可以实现很好看的效果,下面我便教大家如何用CSS做一个爱心. 前期预备知识: ...
- NetAnalyzer笔记 之 三. 用C++做一个抓包程序
[创建时间:2015-08-27 22:15:17] NetAnalyzer下载地址 经过前两篇的瞎扯,你是不是已经厌倦了呢,那么这篇让我们来点有意思的吧,什么,用C#.不,这篇我们先来C++的 Wi ...
- Micropython 如何用Turnipbit做一个自动浇水装置
最近在研究Turnipbit这块板子,打算是连接一个摄像头模块,正在实验练习中,(祝自己早日弄好)上篇文章我们讲了用Turnipbit连接LCD5110显示英文词句,前几天给家里花浇水的时候发现花招了 ...
- 用pyqt5做一个能python程序能插入图片的ide
之前只是放到github上了,现在一想应该开源,大家想继续做好这个ide的都能从这里起步. #注意在.py文件相同目录下放一个1.png做测试图片 #本质就是用html来实现图片 #写在前面的话:这个 ...
- 我的第一个 Windows 窗口程序(1)
一般来说,构建一个 Windows 程序可以分为如下几个步骤: 定义窗口类(WNDCLASS) 注册窗口类(RegisterClass) 创建窗口(CreateWindow) 更新显示窗口(Updat ...
- 使用python做一个爬虫GUI程序
整体思路和之前的一篇博客爬虫豆瓣美女一致,这次加入了图片分类,同时利用tkinter模块做成GUI程序 效果如下: 整体代码如下: # -*- coding:utf-8 -*- import requ ...
随机推荐
- 【PHP内存泄漏案例】PHP对象递归引用造成内存泄漏
[案例一] 作者:老王 如果PHP对象存在递归引用,就会出现内存泄漏.这个Bug在PHP里已经存在很久很久了,先让我们来重现这个Bug,代码如下: <?php class Foo { funct ...
- Ubuntu 16.04安装cuda7.5 GCC
http://www.linuxidc.com/Linux/2017-01/139320.htm 在介绍Ubuntu 16.04安装 CUDA7.5开始前,先辨析几个概念GPU.NVIDIA.NVID ...
- [SQL基础]入门
目录 什么是SQL? SQL能做什么? RDBMS SQL常见数据类型 SQL语法 什么是SQL? 结构化查询语言(Structured Query Language)简称SQL. 结构化查询语言是一 ...
- windows系统上安装与使用Android NDK r8d(一)
什么是NDK? NDK 提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so 和 java 应用一起打包成apk.这些工具对开发者的帮助是巨大的. NDK 集成了交叉编译器,并 ...
- Gulp插件less的使用
1.创建:gulpfile.js var gulp = require('gulp'), less = require('gulp-less'); gulp.task('default', funct ...
- Linux C/C++开发工具
1. vim + ctags + taglist + cscope + cppcomplete + global 2.emacs+插件 可以查看 http://blog.163.com/yu_hong ...
- JSP如何导入ckeditor
<textarea rows="3" cols="100" id="editor1"></textarea> < ...
- iOS:shareSDK第三方登录
shareSDK第三方登录跟分享差不多,比较简单,前面已有介绍.这里简单写一下第三方登录吧. 1.首先:我用到了QQ.微信.新浪这三个平台的登录,需要到它们各自的开发者平台注册开发者账号,这是我的QQ ...
- ECharts学习总结(一):ECharts的第一个图表
在进行echarts图表开发之前先要到echarts官网下载echarts的库文件,我下载的是echarts-2.2.7.然后把库文件放到工程文件web目录下.接下来进行第一个图表的显示步骤如下: 1 ...
- KVM&Libvirt基本概念及开发杂谈
导读 大家好,本次肖力分享的主题是KVM&Libvirt基本概念及开发杂谈,内容有些凌乱松散,主要基于自己早期整理的笔记内容和实践感悟,有些内容难免有失偏颇,望见谅.前面先介绍下需要了解的基本 ...