利用桌面背景进行任务管理
来源:互联网 发布:wine qq2016 linux 编辑:程序博客网 时间:2024/05/14 11:33
背景
作为一个轻微强迫症患者,我一直以来的桌面都是这样的:
(如何隐藏桌面图标、开始菜单、托盘图片不在本文讨论范围。。。)
但是记性一直不是很好的我很希望有个可以作为提醒的东西可以放到桌面上。一开始我投靠了Windows自带的便签,当然这个功能还是很好用的,但是我不能容忍出现这种情况:
如果用这个便签 就会在任务栏多一个项目 而且在alt+tab的时候会多一个选项(smart link一定会被我弄掉的!!!),这样每次切换的时候都可能浪费几毫秒。。。
我就是想要一个提醒嘛。。。也不用很好看。。所以我就准备在自己的桌面壁纸上做文章
一开始 我就直接用画图添加了。。后来实在太麻烦 就写了个程序来进行更改,没想到在其中还学到了一些新的技术,就总结一些好了。。
啊。。先展示一些结果吧。。目前我的桌面如下:
具体实现
第一步是对图片进行添加文字的处理
其实这里没什么难点,主要是计算文字的位置以及调整文字的大小。
JDK里有自带的图片处理类,这里主要用到的是java.awt.Graphics2D里的drawString()方法。
drawString(String str, int x, int y) 可以将字符串str添加到图片(x,y)位置。需要注意的是:对图片进行处理的时候坐标是反转的第一象限。
利用Font、FontRenderContext、Rectangle2D可以设置画笔Graphics2D的字体大小以及获得文字的宽度和高度(这一点很重要)
之后就是一步步计算文字的位置,此处省略。。。
主要的代码如下:
public static void drawText(Graphics2D g, String logoText, int line) { // 设置颜色 g.setColor(Color.WHITE); // 设置 Font Font font = new Font("黑体", Font.BOLD, 30); g.setFont(font); FontRenderContext context = g.getFontRenderContext(); Rectangle2D bounds = font.getStringBounds(logoText, context); double x = (width - bounds.getWidth()) - 10; double y = -line * 1.5 * bounds.getY(); g.drawString(logoText, (int) x, (int) y); }
第二步是将生成的图片设置为桌面背景(这儿有大坑)
因为更改桌面背景的时候,需要刷新桌面,Java本身是不能对Windows进行操作的,所以这里需要利用JNA调用DLL文件里的原生函数进行处理。
有关JNA的简介,可以去看一下http://www.doc88.com/p-31975835542.html 这篇文章
利用user32.dll里的SystemParametersInfoA函数 就可以向Windows系统发送更新桌面壁纸的消息了,这里需要设置uiAction为0x0014即十进制的20。
详情可以看一下微软给的文档
https://msdn.microsoft.com/en-us/library/windows/desktop/ms724947(v=vs.85).aspx
这儿的坑在哪呢?在这儿:
使用SystemParametersInfoA函数设置桌面壁纸的时候,只能使用JPG格式的图片!!而我们正常使用的右键设置为桌面的时候用的是stobject.dll。。。而微软的文档里也没有给出图片格式的说明~所以大部分的时间都是在调这个bug…….
下面是主要的代码:
public static boolean setBackPic() throws IOException { Advapi32Util.registrySetStringValue(WinReg.HKEY_CURRENT_USER, "Control Panel\\Desktop", "Wallpaper", path); Advapi32Util.registrySetStringValue(WinReg.HKEY_CURRENT_USER, "Control Panel\\Desktop", "WallpaperStyle", "0"); Advapi32Util.registrySetStringValue(WinReg.HKEY_CURRENT_USER, "Control Panel\\Desktop", "TileWallpaper", "0"); int SPI_SETDESKWALLPAPER = 0x0014; int SPIF_UPDATEINIFILE = 0x0001; int SPIF_SENDWININICHANGE = 0x0002; return MyUser32.INSTANCE.SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, path, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE); }
下个版本计划
目前还只能通过eclipse进行处理 下一步要做成UI界面的
对图片的处理耗时有点长 下个版本要优化!!
- 利用桌面背景进行任务管理
- 利用Eclipse的TaskList功能进行任务管理
- 利用Github进行版本管理
- 利用SVN进行源代码管理
- 利用zabbix API进行管理
- 使用禅道来进行项目任务管理
- springMVC使用quartz进行定时任务管理
- 利用Spring aop 进行权限管理
- 利用Rational ClearQuest 进行变更管理
- 利用HigroupBBS小论坛进行资料管理
- 利用WMIC进行本地计算机管理
- 利用SVN China服务器进行代码管理
- 利用位运算进行权限管理
- Xcode利用快照进行项目备份管理
- Android 利用Properties进行authority管理
- 利用位运算进行权限管理
- 利用Spring AOP进行日志管理
- 利用GitHub进行敏捷开发管理
- sklearn做单机特征工程
- Android添加项目编译.[笔记]
- 机器学习入门之决策树法
- 【NOIP模拟题】【DP】【快速幂】2016.11.16 第二题
- linux下目录操作---进入、显示、复制、移动
- 利用桌面背景进行任务管理
- echo.js 轻量级的js中的图片懒加载插件
- cc,gcc,g++
- jQuery获取元素位置以及高度与宽度
- WebView加载百度公交连接问题
- Zabbix实践(四) zabbix的通知推送解决方案
- UVA-1588 Kickdown
- 一个人的旅行一一云田一品
- opencv中Mat的使用和设置ROI的方法