[愚翁专栏]如何用C#做一个类似于桌面插件的程序

如何用C#做一个类似于桌面插件的程序 最近看到有人问如何做一个“桌面天气秀”类似的软件,开始我以为做这个东西很复杂,因为觉得至少要传递Message给Desktop。但事实上,一试之后发现做这个程序竟然很简单。 以下就把做的步骤列出来,供大家参考。首先,需要设置窗体样式,这里面要设置的有:l         设置FormBorderStyle为None;l         设置TopMost为false;l   阅读详情
如何用C#做一个类似于桌面插件的程序

最近看到有人问如何做一个“桌面天气秀”类似的软件,开始我以为做这个东西很复杂,因为觉得至少要传递Message给Desktop。但事实上,一试之后发现做这个程序竟然很简单。

 

以下就把做的步骤列出来,供大家参考。

首先,需要设置窗体样式,这里面要设置的有:

l         设置FormBorderStyle为None;

l         设置TopMost为false;

l         设置ShowInTaskbar为false;

l         为了能穿透桌面,要把BackColor设为White,在把TransparentKey设为White;

 

这样,窗体的基本设置就完成了,为了显示要画的内容,则需要在窗体的Paint事件中去做,我这里所画的内容是显示当前月的所有天,相当于一个小日历。

private void Draw( Graphics g )

{

    const float REG_HEIGHT = 30f;

    const float START_POS_X = 0f;

    const float START_POS_Y = 0f;

    const int BLANK_SPACE_NUM = 5;

 

    // Draw day of week signal

    RectangleF recRegion = new RectangleF( START_POS_X, START_POS_Y,

        (float)(this.Width), REG_HEIGHT );

    const string FORMAT_STRING = "{0}{1}{2}{3}{4}{5}{6}";

    string strDraw = string.Format( FORMAT_STRING,

        "SUN".PadLeft( BLANK_SPACE_NUM, ' ' ),

        "MON".PadLeft( BLANK_SPACE_NUM, ' ' ),

        "TUE".PadLeft( BLANK_SPACE_NUM, ' ' ),

        "WED".PadLeft( BLANK_SPACE_NUM, ' ' ),

        "THU".PadLeft( BLANK_SPACE_NUM, ' ' ),

        "FRI".PadLeft( BLANK_SPACE_NUM, ' ' ),

        "SAT".PadLeft( BLANK_SPACE_NUM, ' ' ) );

    Font myFont = new Font( "宋体", 11, FontStyle.Bold );

    StringFormat sfDraw = new StringFormat();

    sfDraw.Alignment = StringAlignment.Near;

    sfDraw.LineAlignment = StringAlignment.Far;

    Brush brDraw = new SolidBrush( Color.Wheat );

 

    g.DrawString( strDraw, myFont, brDraw, recRegion, sfDraw );

    DateTime dtFirstDate = DateTime.Now.AddDays( 1 - DateTime.Now.Day );

   

    int nStartIndex = (int)(dtFirstDate.DayOfWeek);

    nStartIndex++;

    TimeSpan tsDays = dtFirstDate.AddMonths( 1 ) - dtFirstDate;

   

    // Draw every day in this month

    strDraw = "";

    int i = 0;

    for( ; i < tsDays.Days; i++ )

    {

        switch( dtFirstDate.AddDays( i ).DayOfWeek )

        {

            case DayOfWeek.Sunday:

            case DayOfWeek.Monday:

            case DayOfWeek.Tuesday:

            case DayOfWeek.Wednesday:

            case DayOfWeek.Thursday:

            case DayOfWeek.Friday:

                strDraw += (i+1).ToString().PadLeft( BLANK_SPACE_NUM, ' ');

                break;

            case DayOfWeek.Saturday:

                strDraw += (i+1).ToString().PadLeft( BLANK_SPACE_NUM, ' ');

                strDraw = strDraw.PadLeft( BLANK_SPACE_NUM * 7, ' ' );

                recRegion = new RectangleF( START_POS_X,

                    START_POS_Y + REG_HEIGHT * ( 1 + ( (i+1) + nStartIndex - 7 ) / 7 ),

                    (float)(this.Width), REG_HEIGHT );

                g.DrawString( strDraw, myFont, brDraw, recRegion, sfDraw );

                strDraw = "";

                break;

        }

    }

 

    if( strDraw != "" )

    {

        strDraw = strDraw.PadRight( BLANK_SPACE_NUM * 7, ' ' );

        recRegion = new RectangleF( START_POS_X,

            START_POS_Y + REG_HEIGHT * ( 1 + ( i + nStartIndex - 7 ) / 7 + 1 ),

            (float)(this.Width), REG_HEIGHT );

        g.DrawString( strDraw, myFont, brDraw, recRegion, sfDraw );

    }

}

 

private void frmSprite_Paint(object sender, System.Windows.Forms.PaintEventArgs e)

{

    Graphics g = e.Graphics;

    Draw( g );

}

 

为了窗体能方便的退出,我加了一个NotifyIcon和ContextMenu来处理,具体如下。

private System.Windows.Forms.NotifyIcon ntfSprite;

private System.Windows.Forms.ContextMenu mnuContext;

private System.Windows.Forms.MenuItem mnuExit;

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

{

    this.Close();

}

 

       本来以为自己的窗体放在Desktop之前,会影响窗体下Desktop的某些操作,但事实,这一点根本不用担心,因为.Net框架已经替你做了,因此你不用再调用API来传递消息。

 

如果想要所显示的窗体能够随意拖动,这可以参看我另外一篇文章:

http://blog.youkuaiyun.com/knight94/archive/2006/04/14/663089.aspx

 

以上的代码只是做了简单的测试,大家可以在我的基础上做扩展,例如调用Api来对当前进程作一些隐藏,设置窗体的起始位置,以及一些界面操作之类,放到启动菜单,这些都是可以完成的,我这里就不罗嗦了。



Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=724967

透明桌面日历的制作 [愚翁专栏]中有一个 如何用C#做一个类似于桌面插件的程序 的例子,拿来实际演练了一下,发现只是实现一个界面而已,只有没有日历的内容。但是这勾起了我的兴趣,决定自己做一个。在http://www.codeproject.com/cs/miscctrl/MonthCalendar.asp上有一个MonthCalendar控件,既有源代码又有demo,我发扬了鲁迅先生的拿来主义,统统接收。对于这个 阅读详情

相关推荐

C#实现的动态桌面软件-桌面精灵

使用C#实现的动态桌面,可以在桌面顶层播放透明flash(自动将flash底色透明),画面在最顶层,持续动态显示,不影响对其他程序的正常操作。支持从远程服务器更新动态flash。可以拓展成桌面宠物软件等 文档为rar压缩包,内涵全部C#程序工程文件及最终的EXE文件。

制作桌面精灵(动态桌面)——鼠标跟随的粒子效果

这里使用了nowpaper的一个例子: Silverlight C# 游戏开发:绚丽的粒子特效-颜色粒子(一) 我新建了一个WPF 3.5项目,将里面的代码添加了几个方法,就可以在桌面上使用这个效果。 主要原理是用了一个鼠标的钩子的引用确定鼠标所在的指针位置。 我修改了里面的一个类:Colorful_FollowMouse 具体代码如下 public class Color...

weixin_30252155的博客 1016

桌面精灵-阿狸桌宠

桌面宠物 解压后,双击Shimeji即可自动运行。 如不能自动运行,请下载JAVA6后,再进行以上步骤。 运行桌面宠物时,右键,单击选项即可退出该桌宠. win7系统尚不兼容这类型软件。

windows/linux桌面精灵(带源码)

效果图: 代码实现逻辑: 桌面上展示的动画均为gif无背景动图(可以下载一套指定模型的gif图),通过监听键盘的输入或者鼠标的点击拖拽,来实现动画的切换,在切换时,通过播放控制器来实现动画正常的切换,而不是突然被打断,或者鬼畜,播放完动画,会根据具体的动画恢复到设置好的结束动画(可以是待机,也可以是衔接动画) 扩展:启动时会启动一个图标,可以通过图标停止或者隐藏桌面精灵,可以通过扩展功能来实现日常小工具,可在图标列表中添加,或者通过动作事件监听触发(例如实现json的格式转换,加密解密) 源码下载地

xtb666666的博客 1504

[源代码] C# WinForms 模块 - 桌面精灵模块

☆ 资料说明: ☆ 阴历、阳历转换算法; 显示指定日期所对应的星座; 备忘录循环提醒; 农历节日的显示; ☆ 功能说明: ☆ 主界面:风格显示、转到、查看指定日期的详细信息、从上次关闭位置启动窗体; 窗口设置:普通显示、总在最前、鼠标穿透、允许移动、控制主界面透明度; 节日管理:新建节日、修改节日、删除节日、节日过滤; 提醒管理:新建提醒、修改提醒、删除提醒;

用C#编写的桌面小宠物!超级可爱!

使用C#编写 附带详细 的原代码!希望能对各位的学习有所帮助!

[C# SDK/IDE]-VSCode 搭建 C# 开发环境

获取安装 Visual Studio Code 汉化及插件配置 官网下载安装.NET Code SDK 初识 .NET SDK 的一些命令 基本 C# 程序编译和运行 命令行单独利用 SDK 命令初始化工作空间并编译运行 C# 程序 在 VSCode 中搭配 SDK 编译运行 C# 程序 安装配置 Code Runner 插件更方便地编译运行 以及本节资源下载...............

燃吹 U 客帮 2万+

c# 桌面宠物

c# 桌面宠物,类似QQ宠物,源代码 有喂食其他特效,桌面宠物源代码

C#winform窗体各种实例(搜集)

Form是WinForm开发中非常重要的一个控件, 本文将包含如何制作一个关于对话框,系统载入提示窗体, 创建类似于QQ提示框以及创建不规则窗体等(文章及相关代码搜集自网络,仅供学习参考,版权属于原作者! ).    1.愚翁专栏   优快云第一期总结之一:Form问题 Form问题是最基本的问题,因为编写WinApp程序首先接触的对象就是它,因此在论坛中对它而产生的问题也最常见。与F

敖鸿,永远的精灵---Elf 1万+

c# 悬浮窗口 带提示框提示 可拖动 类似于迅雷 (源代码)

c# 悬浮窗口 带提示框提示 可拖动 类似于迅雷 c# 悬浮窗口 带提示框提示 可拖动 类似于迅雷 c# 悬浮窗口 带提示框提示 可拖动 类似于迅雷 c# 悬浮窗口 带提示框提示 可拖动 类似于迅雷

C#桌面精灵模块源码(桌面日历+托盘菜单)

摘要:C#源码,菜单窗体,桌面日历,托盘菜单,鼠标穿透  一个综合了许多C#技巧的不错源码,带托盘菜单和半透明窗体特效的桌面精灵模块源代码,程序运行后第一个显示的是一个支持穿透的C#桌面日历,在托盘菜单中可选择窗口风格为“鼠标穿透”,可设置开机启动、设置日程提醒、设置窗口透明度等,可以说本程序中的很多技巧,对初学者来说都是有益需要掌握的,而且源代码中的注释也很清楚,帮助你学习C#编程。各个模块的主要功能说明:   窗口设置模块主要设置程序主界面的默认显示风格及透明度。   “风格”菜单主要用于改变当前主界面的显示风格。   “转到”菜单可以分别按周、月、年调整日期。   提醒模块可以添加、修改

C#/Winform入门、进阶、强化、扩展、知识体系完善等知识点学习、性能优化、源码分析专栏分享...

场景作为一名C#的Winform开发者,势必经历过从入门到自学、从基础到进阶、从学习到强化的过程。当经历过几年企业级开发的磨炼,再回头看之前的开发过程、成长阶段发现确实是走了好多的弯路。作为一名终身学习的信奉者,秉承Java体系需持续学习、持续优化的信念。不惜耗费无数个日日夜夜,耗费大量时间精力将开发过程中所用到的Winf...

weixin_40346807的博客 173

TPC好像是这么回事儿

TPC(Transmit Power Control)发送功率控制,本觉得就是控制一下发送功率,原理很简单,但看原版协议死活每搞懂什么意思,恼羞成怒!!!! 后来又看了一些贴子和cisco的相关功能介绍,再回头看协议,好像是这么一回事: 1、所谓TPC,是AP控制STA的发送功率的一种手段。在802.11d中,已定义了使用Country Element传递区域无线通信规定的信道和最大发送功率信息: 通过获取这些信息,STA可以确定自己应该遵守什么规则,可以用什么发送功率在哪些信道上通信。 2

两只勤劳的蜜蜂 8625

C#/Winform入门、进阶、强化、扩展、知识体系完善等知识点学习、性能优化、源码分析专栏分享

作为一名C#的Winform开发者,势必经历过从入门到自学、从基础到进阶、从学习到强化的过程。当经历过几年企业级开发的磨炼,再回头看之前的开发过程、成长阶段发现确实是走了好多的弯路。作为一名终身学习的信奉者,秉承Java体系需持续学习、持续优化的信念。不惜耗费无数个日日夜夜,耗费大量时间经历将开发过程中所用到的Winform开发常用基础知识点汇总、Winform开发项目搭建、配置详解、Winform开发集成第三方框架详解、Winform开发日常开发常见错误问题处理、

BADAO_LIUMANG_QIZHI的博客 1390

从DDH到FastANI:原核生物分类黄金标准的进化史与技术对比

本文系统梳理了原核生物分类标准从DDH到FastANI的四次技术革命,详细解析了95%相似度阈值的科学依据及应用场景。通过对比DDH、16S rRNA、ANI和FastANI的技术特点与性能指标,为微生物研究者提供基因组分类的实战指南,并展望第三代测序时代的分类新挑战。

weixin_29275257的博客 412

Ventoy引导自定义菜单配置详解:手把手教你用ventoy_grub.cfg启动硬盘里的Manjaro

本文详细解析了Ventoy引导自定义菜单配置方法,重点介绍如何通过ventoy_grub.cfg文件启动硬盘中的Manjaro系统。从Ventoy与GRUB2的协作原理到具体配置步骤,包括分区布局设计、关键参数解析及常见问题解决方案,帮助用户实现多系统引导的灵活管理。

weixin_28738165的博客 299

vscode c++插件_程序员常用编程工具: VS Code,那些你不得不知道的小知识!

工欲善其事,必先利其器。这句话真好,一句话可以写两篇文章。上一篇我们介绍了键盘,对于程序员来说,光有键盘可不行,你还需要一个趁手的编程工具。就像很多工程师对 HHKB 键盘情有独钟一样,好的编程工具可以成倍的提高你的编程效率和程序质量。我的编程工具历程大概是这样的:最开始用 Editplus,不知道是否还有人记得这个工具,写完代码通过 ftp 提交到服务器端运行调试,后来开始使用 Vim 直接在服...

weixin_39961522的博客 258

使用 MATLAB/Simulink + Simscape Electrical,构建一个含光伏并网系统与SVG的联合仿真模型,实现动态无功补偿与电压支撑

摘要:本文详细介绍了基于Simulink的SVG与光伏并网逆变器联合系统建模方法。通过构建包含光伏单元、SVG主电路和控制模块的仿真模型,实现动态无功补偿与电压稳定。重点阐述了ip-iq无功检测算法、双闭环控制和SVPWM调制等关键技术。仿真结果表明,该系统能快速响应无功需求,在10ms内将功率因数提升至0.98以上,有效抑制电压波动。文章为新能源并网系统中的电能质量治理提供了实用解决方案,并提出了进一步优化方向。

xiaoheshang_123的博客 322

C# WinForm开发系列 - Form/Window

Form是WinForm开发中非常重要的一个控件, 本文将包含如何制作一个关于对话框,系统载入提示窗体, 创建类似于QQ提示框以及创建不规则窗体等(文章及相关代码搜集自网络,仅供学习参考,版权属于原作者! ).   1.愚翁专栏   优快云第一期总结之一:Form问题Form问题是最基本的问题,因为编写WinApp程序首先接触的对象就是它,因此在论坛中对它而产生的问题也最常见。与Fo

探索者的专栏 3211

13.0 针对跳转不存在Activity崩溃处理,改成弹Toast提示,去掉崩溃弹窗,避免app崩溃退出

在开发过程中,在app跳转到某个没注册的Acitivity时,往往会出现崩溃的场景,这样也不好,接下来就从framework中来拦截这个崩溃,改成toast提示,

安卓兼职framework和app工程师的博客 48

VTK:受约束的 Delaunay 2D用法实战

VTK:受约束的 Delaunay 2D用法实战程序输出程序完整源代码 程序输出 程序完整源代码 #include <vtkActor.h> #include <vtkCellArray.h> #include <vtkDelaunay2D.h> #include <vtkMath.h> #include <vtkMinimalStandardRandomSequence.h> #include <vtkNamedColors.h>

希望我的博客,能帮上你解决学习中工作中所遇到的问题 940

vscode你最后一个编辑器_宇宙最强编辑器VS Code

0.VSCode专栏简介首先简要的介绍一下,本专栏的作者之前痴迷于上古神器 —— 编辑器之神vim,特别喜欢折腾,后来偶然的机会接触到VS Code,这个基于前端技术的编辑器引起了我强烈的兴趣,果断转到VS Code(真香啊),后来深入研究,创作了本专栏,希望可以手把手带领感兴趣的小伙伴上手宇宙最强编辑器VS Code,高效编码,高效划水。先放上本专栏的目录,满足一下好奇心:初识VS Code美化...

weixin_29325955的博客 1151

C# WinForm上位机:从串口调试工具到智能温控系统(Modbus RTU协议实战+完整源码)

做工业上位机开发时,我们常从串口调试工具入手:验证设备通信、查看数据帧,但面对实际场景(比如温控、电机控制),单纯的“收发数据”远远不够——需要解析工业标准协议(如Modbus RTU)、实时监控关键指标、实现自动化控制逻辑,还要有稳定的UI交互和数据记录。串口调试工具能收发数据,但看不懂Modbus RTU帧(地址、功能码、寄存器、CRC校验);想控制温控设备(如加热器、风扇),但不知道如何通过Modbus写入控制指令;手动调节目标温度时,温度波动大,需要PID算法实现精准控温,但不会集成;

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1301
上一篇: [愚翁专栏]如何把多个文件写入到一个文件中去并能分解
下一篇: [愚翁专栏]如何把网络共享目录映射为本地驱动器
MaybeHelios
博客等级 码龄21年 65粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值