设置windows背景
目的
- 使便利贴可以启动时直接显示在桌面.且不应当影响壁纸的正常展示.
- 不会在任务栏中出现标题等信息影响正在做的项目.
- 有快捷键可以快速预览一下.比如win+D看一下自己的任务.
即在不破坏壁纸的情况下在桌面增加一些额外展示.
实现方式
- 在桌面上方直接再画一个窗口,这个窗口作为桌面
- 在这个窗口设计墙纸和增加其他内容
具体细节
- 制作程序一: 给予两个参数(类名),设置窗口的父子关系
- 制作程序二: 使用nw创建一个窗口(不需要设置全屏),在此基础上增加js监听,壁纸,图标打开软件等功能.
实际操作
使用spy查看窗口类名
获得桌面句柄和NW相关窗口类名从而获得窗口句柄.
程序一
使用CFree构建该代码,
核心函数: void setParent(childClassName, ParentClassName);
源代码:
// setWindowParent.c
#include <windows.h>
#include <stdio.h>
void hint();
void setParent(char* childClassName,char* ParentClassName);
int main(int argc, char* argv[]){
//printf("%d %s", argc, argv[0]); argv[0]保存了自身数据
if(argc!=3){ hint(); return 1; }
setParent(argv[1], argv[2]);
return 0;
}
void hint(){
printf("this need two args about TopWindow CLASSNAME, you can look it by spy++\n");
printf("the desktop's class name is 'Progman'\n");
}
void setParent(char* childClassName,char* ParentClassName){ SetParent(FindWindow(childClassName, 0), FindWindow(ParentClassName, 0)); }
调用使用批处理文件: setWindowParent.exe Chrome_WidgetWin_1 Progman
程序二
使用NW.js配套环境构造该程序,步骤如下:
- 创建package.json
//package.json
{
"name": "", // 任务栏中名称
"main": "www/index.html", // 主界面网页位置
"js-flags": "--expose-gc",
"window": {
"title": "", // 标题
"toolbar": false, // 菜单栏
"width": 816,
"height": 624,
"icon": "www/icon/icon.png", // 图标
"position": "center", // 窗口在父窗口的位置
"min_width": 400,
"min_height": 200,
"show": true, // 是否可见
"fullscreen": false // 是否全屏
}
}
-
在www文件夹下创建index.html等html必需文件
-
执行Game.exe程序,显示如下
集成
- 将setWindowParent.exe放置NW.exe环境下,建立批处理start.bat文件:
rem start.bat
start NW.exe
setWindowParent.exe Chrome_WidgetWin_1 Progman
- win+R输入shell:startup打开自启动文件夹,设置快捷方式或批处理文件放入该文件夹也可以使用C:\Users\outer\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup这个路径加入执行文件
问题
在最新的测试中,我打开了VSCode,在执行start.bat的时候,发现嵌入桌面的不是NW.exe程序,而是VSCode,我意识到它们的类名都是Chrome_WidgetWin_1.经过spyxx验证,确实如此.所以,基于Chromium的软件基本都是相同的类名,并就地执行最近的Chrome_WidgetWin_1.当我再次执行setWindowParent,虽然NW.exe也被加载进去了,但是结果上却只出现了VSCode界面,原因未知.在我将VSCode隐藏在桌面时,我便无法再获得该窗口了.
这些问题需要一些操作:
- 在加载EXE作为桌面时,禁止最小化.
- 在加载时,先判断桌面下是否有相同类名,如果Progman下已存在一个该窗口,就不要再加载了.
解决方案:
- 这个通过NW.js本身处理.
- 先打开NW.exe程序,延迟2s,但NW.exe被加载后再将该窗口加入桌面.
优化
- 直接绑定NW.js和C程序,不允许更改数据.
- 设置自启动
最终成品
// startNW.exe
#include <windows.h>
#include <stdio.h>
HWND getWindow(char* className, char* titleName){return FindWindow(className, titleName);}
HWND getDesktop(){return FindWindow("Progman", 0);}
HWND getNW(){return FindWindow("Chrome_WidgetWin_1", 0);}
int runExe(char* exeName){
STARTUPINFO si; PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
return CreateProcess(NULL,exeName,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
}
int main(int argc, char* argv[]){
runExe("NW.exe");
Sleep(1000);
SetParent(getNW(), getWindow("Progman",0));
return 0;
}
将该软件直接放入NW.exe同一路径下,直接执行NW.exe.
想修改窗口大小和风格以及背景图,桌面图标等,请自行学习NW程序相关内容.