利用桌面背景进行任务管理

来源:互联网 发布: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界面的
对图片的处理耗时有点长 下个版本要优化!!

0 0
原创粉丝点击