C++用桌面图标系列之三【整理-时钟】
他来了,他来了,桌面图标一百种玩法第三种,桌面时钟。
学会了就发给女朋友玩吧,效果炫酷,学不了吃亏,学不了上当,走过路过不要错过。
老规矩,先看看视频效果。
C++用桌面图标系列之三【整理-时钟】
核心代码
除了基本的时间展示之外,还包含了初始动画。
int nScreenWith;
int nScreenHeigh;
typedef struct tagMovingIcon
{int index;int targetX;int targetY;int startX;int startY;int aniDelay; //动画延迟时间,随机的。打造一种乱中有序的氛围}MovingIcon, *PMovingIcon;vector<MovingIcon> vMoveAniIcons; //动画队列的图标索引
ULONGLONG startAniTick; //记录动画起始时间DWORD dwProcessId = 0;
HANDLE hProcess;
LPVOID lpvPt;BOOL MoveTo(int numIndex, int posX, int posY, int iconIndex, bool moveAni = false);
void WriteNumber(int numIndex, int numberShade[ROW][COL], bool moveAni = false);
BOOL CALLBACK EnumWindowsProc(_In_ HWND TopHandle, _In_ LPARAM topparamhandle);
void DoMoveAni();
//桌面图标层句柄
HWND hwndSysListView32;//逻辑起点
void ClockLogic()
{vector<int(*)[COL]> vNumberShade;vNumberShade.push_back(num0);vNumberShade.push_back(num1);vNumberShade.push_back(num2);vNumberShade.push_back(num3);vNumberShade.push_back(num4);vNumberShade.push_back(num5);vNumberShade.push_back(num6);vNumberShade.push_back(num7);vNumberShade.push_back(num8);vNumberShade.push_back(num9);HWND hwndParent = ::FindWindow("Progman", "Program Manager");HWND hwndSHELLDLL_DefView = ::FindWindowEx(hwndParent, NULL, "SHELLDLL_DefView", NULL);hwndSysListView32 = ::FindWindowEx(hwndSHELLDLL_DefView, NULL, "SysListView32", "FolderView");if (hwndSysListView32 == NULL){//***注意,某些情句柄有空的,尝试用下面的函数来查找句柄***//***也可以自行使用vs的工具spy++工具来查看层级是否准确*****EnumWindows(EnumWindowsProc, (LPARAM)nullptr);if (hwndSysListView32 == NULL)return;}int iconCount = ListView_GetItemCount(hwndSysListView32);if (iconCount < TOTAL_ICON_COUNT){//图标数量不够啊大佬,多复制几个return;}GetWindowThreadProcessId(hwndSysListView32, &dwProcessId); //通过桌面窗口句柄获取此窗口所在进程的PID,其实就是explorer进程hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId); //打开指定PID进程,取得进程句柄lpvPt = VirtualAllocEx(hProcess, NULL, sizeof(POINT), MEM_COMMIT, PAGE_READWRITE);//在指定进程里面申请一个POINI结构大小的空间.for (size_t i = 0; i < iconCount; i++){if (i >= TOTAL_ICON_COUNT - 1){//这里会将所有多余的桌面图标放到接们看不见的位置,后面可以右键桌面设置对齐网格还原图标位置SendMessage(hwndSysListView32, LVM_SETITEMPOSITION, i, MAKELPARAM(-100, -100));}else{//将图标打乱,这部分只是为了拍视频 可删除random_device rd;uniform_int_distribution<int> ranX(0, nScreenWith);uniform_int_distribution<int> ranY(0, nScreenHeigh);SendMessage(hwndSysListView32, LVM_SETITEMPOSITION, i, MAKELPARAM(ranX(rd), ranY(rd)));}}//这部分只是为了拍视频 可删除Sleep(3000);time_t currentTime;struct tm* p;ULONGLONG nextClockTick = GetTickCount64() + ANI_TOTAL_TIME + ANI_DELAY_TIME;//加上动画需要的时间,动画阶数再开始显示时间ULONGLONG nextAniTick = GetTickCount64();startAniTick = GetTickCount64();int checkHour = -1;int checkMin = -1;while (1){if (GetTickCount64() >= nextAniTick){time(¤tTime);p = localtime(¤tTime);if (vMoveAniIcons.size() <= 0){int hour1 = p->tm_hour / 10;int hour2 = p->tm_hour % 10;WriteNumber(0, vNumberShade[hour1], true);WriteNumber(1, vNumberShade[hour2], true);int min1 = p->tm_min / 10;int min2 = p->tm_min % 10;WriteNumber(2, vNumberShade[min1], true);WriteNumber(3, vNumberShade[min2], true);int sec1 = p->tm_sec / 10;int sec2 = p->tm_sec % 10;WriteNumber(4, vNumberShade[sec1], true);WriteNumber(5, vNumberShade[sec2], true);}DoMoveAni();nextAniTick += 10;//移动间隔}//下面是正式的时钟显示逻辑///if (GetTickCount64() < nextClockTick)continue;nextClockTick = GetTickCount64() + 1000;time(¤tTime);p = localtime(¤tTime);//小时if (checkHour == -1 || checkHour != p->tm_hour){checkHour = p->tm_hour;int hour1 = p->tm_hour / 10;//十位数int hour2 = p->tm_hour % 10;//个位数WriteNumber(0, vNumberShade[hour1]);WriteNumber(1, vNumberShade[hour2]);}//分钟if (checkMin == -1 || checkMin != p->tm_min){checkMin = p->tm_min;int min1 = p->tm_min / 10;int min2 = p->tm_min % 10;WriteNumber(2, vNumberShade[min1]);WriteNumber(3, vNumberShade[min2]);}//秒的int sec1 = p->tm_sec / 10;int sec2 = p->tm_sec % 10;WriteNumber(4, vNumberShade[sec1]);WriteNumber(5, vNumberShade[sec2]);}}void WriteNumber(int numIndex, int numberShade[ROW][COL], bool moveAni)
{int nIconIndex = numIndex * (ROW * COL);for (size_t row = 0; row < ROW; row++){for (size_t col = 0; col < COL; col++){if (numberShade[row][col] == 1)MoveTo(numIndex, row, col, nIconIndex, moveAni);elseMoveTo(numIndex, -1, -1, nIconIndex, moveAni); //不需要显示的就挪到看不见的地方++nIconIndex;}}
}//图标iconIndex 移动到目标点
BOOL MoveTo(int numIndex, int row, int col, int iconIndex, bool moveAni)
{//int numGap = numIndex % 2 == 0 ? (numIndex / 2) * NUM_GAP2 : ((numIndex - 1) / 2) * NUM_GAP2 + NUM_GAP1;//int targetX = 0, targetY = 0, numGap = 0;if (row == -1)//需要移出屏幕的图标{targetX = -100;targetY = 0;}else if (numIndex == 0 || numIndex == 1)//时{numGap = numIndex % 2 == 0 ? 0 : NUM_GAP1;targetX = nScreenWith / 4 - GRID_WIDTH * COL + numGap + col * GRID_WIDTH;targetY = nScreenHeigh / 3 + row * GRID_WIDTH - 120;}else if (numIndex == 2 || numIndex == 3)//分{numGap = numIndex % 2 == 0 ? 0 : NUM_GAP1;targetX = (3 * nScreenWith / 4) - GRID_WIDTH * COL + numGap + col * GRID_WIDTH;targetY = nScreenHeigh / 3 + row * GRID_WIDTH - 120;}else if (numIndex == 4 || numIndex == 5)//秒{numGap = numIndex % 2 == 0 ? 0 : NUM_GAP1;targetX = nScreenWith / 2 - GRID_WIDTH * COL + numGap + col * GRID_WIDTH;targetY = nScreenHeigh / 2 + row * GRID_WIDTH + 30;}//需要播放动画的if (moveAni && row != -1){//获取图标初始位置POINT pIconCurPos;ListView_GetItemPosition(hwndSysListView32, iconIndex, lpvPt);ReadProcessMemory(hProcess, lpvPt, &pIconCurPos, sizeof(POINT), NULL);random_device rd;//取0 - ANI_DELAY_TIME的随机数uniform_int_distribution<int> dist(0, ANI_DELAY_TIME);MovingIcon icon;icon.index = iconIndex;icon.targetX = targetX;icon.targetY = targetY;icon.startX = pIconCurPos.x;icon.startY = pIconCurPos.y;icon.aniDelay = dist(rd);//放到动画队列里vMoveAniIcons.push_back(icon);}else{SendMessage(hwndSysListView32, LVM_SETITEMPOSITION, iconIndex, MAKELPARAM(targetX, targetY));}return true;
}//做初始动画
void DoMoveAni()
{//动画做了多久ULONGLONG nPassedTime = GetTickCount64() - startAniTick;if (nPassedTime > ANI_TOTAL_TIME + ANI_DELAY_TIME)return;for (auto iter = vMoveAniIcons.begin(); iter != vMoveAniIcons.end(); ++iter){if (nPassedTime < iter->aniDelay)continue;if (nPassedTime - iter->aniDelay >= ANI_TOTAL_TIME){//校正最后的位置SendMessage(hwndSysListView32, LVM_SETITEMPOSITION, iter->index, MAKELPARAM(iter->targetX, iter->targetY));continue;}//当前所在位置 = (经过的时间 / 总时间) * (总路程)//按时间比例来算,应该不复杂 = =!int targetX = 0, targetY = 0;targetX = ((double)(nPassedTime - iter->aniDelay) / (ANI_TOTAL_TIME)) * (iter->targetX - iter->startX);targetY = ((double)(nPassedTime - iter->aniDelay) / (ANI_TOTAL_TIME)) * (iter->targetY - iter->startY);//在vs的输出界面打印信息char out0[128] = { 0 };sprintf(out0, "index=%d x=%d y=%d \n", iter->index, targetX, targetY);//OutputDebugStringA(out0);targetX += iter->startX;targetY += iter->startY;SendMessage(hwndSysListView32, LVM_SETITEMPOSITION, iter->index, MAKELPARAM(targetX, targetY));}
}
这里是完整代码和可执行文件。
https://download.csdn.net/download/Yang9325/16745587
C++用桌面图标系列之三【整理-时钟】相关推荐
- Microsoft Hyper-V Server 2008 R2和SCVMM2012部署XenDesktop 5.6桌面虚拟化系列之三准备XenDesktop服务器...
Microsoft Hyper-V Server 2008 R2和SCVMM2012 部署XenDesktop 5.6桌面虚拟化系列 之三准备XenDesktop服务器 接着上一篇文章内容<Mi ...
- 苹果手机透明桌面_原来通过桌面图标就能知道苹果手机真假!涨见识了
苹果手机一直以良好的操作体验深受用户喜爱,但由于苹果手机都比较昂贵,假货成风,很多朋友都害怕自己买到了假货. 其实大家可以通过桌面上的图标就能分辨苹果手机真假,下面就带大家一起去看看,非常涨见识哦! ...
- 用 C++ 在Windows中清空回收站内文件/隐藏和显示桌面图标 / Windows任务栏 / 任务栏时钟 / 更改桌面壁纸
如果感觉这篇文章帮助到你的话,欢迎捐助我! bitcoin : bc1qvvkqmwcd7s9fas063htffm76k63rx7f3r9dp4r 清空回收站内文件 #include<wind ...
- C++桌面图标游戏系列之二【俄罗斯方块】
最近写了一个C++桌面图标游戏系列之一[贪吃蛇]. https://blog.csdn.net/Yang9325/article/details/111031297 没想到还挺受欢迎,那么系列之二[俄 ...
- el-table 树形表格 自定义展开图标_Fences: 正版桌面图标自动整理栅栏工具 非Steam版...
Fences 是知名开发商 Stardock 为 Windows 用户打造的一款经典的桌面管理工具.Fences 通过在桌面自由创建可命名的半透明区域给图标分组,并且在你不需要时隐藏它们.Fences ...
- 计算机桌面显示360,我笔记本电脑扩展了一个显示器,但是再开机后360桌面图标不能显示归集整理框里,全铺开了...
网友求助:我笔记本电脑扩展了一个显示器,但是再开机后360桌面图标不能显示归集整理框里,全铺开了 问题第一张是正常情况,文件夹和文件分两类归集起来.第二张是扩展显示器后,图标全铺开了,拔掉显示器就恢复 ...
- 我对锤子ROM 功能的看法——功能篇——高效整理桌面图标
我对锤子ROM 功能的看法--功能篇--高效整理桌面图标 高效整理桌面图标 老罗:"锤子Rom的Launcher执行效率超过iPhone连到电脑上的5个屏幕." 在一个页面中移动一 ...
- 正版推荐 - Fences 4 – 让你的桌面更加整洁与高效的桌面图标文件整理工具软件!
你的电脑桌面总是杂乱无序?你需要专业的整理工具来帮你管理桌面图标和文件?Fences 4 是你的最佳选择! Fences 4 是一款功能强大.多样化的桌面图标整理工具软件.它可以帮助你轻松整理和管理桌 ...
- 【QA】Windows桌面图标整理美化(无需安装额外的软件,Windows自带)
Question描述 如何整理桌面图标,但又不需要安装额外的软件? Answer细节 possibility answer 1 把所有桌面图标放在"屏幕"上 2 右击任务栏,选择工 ...
最新文章
- redis geohash 学习笔记
- Git系列之git log高级命令
- pyqt5 qscrollarea到达_在PYQT5中QscrollArea(滚动条)的使用方法
- 郑州计算机单招学校有哪些专业,郑州单招的学校有哪些专业
- 利用 PGO 提升 .NET 程序性能
- 解决添加Com引用 生成的Interop.*.dll 版本号永远是1.0的问题
- x86-64寄存器与栈帧(转载)
- Spring事务管理1-------环境搭建
- java 中特殊的_Java中一些特殊关键字
- mysql基础知识(二)
- YouTube架构学习
- 自动化Python+selenium 用这一篇学习就够了
- 数学建模——多属性决策模型
- CrazyTalk Animator 3 for Mac破解版永久激活方法附破解补丁
- acceleration transducer
- 将windows 8安装到U盘随身带!
- Boggle问题积累
- 青少年编程教育等级评测(一级)模拟题_1
- Worktile官网下载
- 手机页面h5的简单demo
热门文章
- android os 1.5 下载地址,技德Remix OS 1.5发布 适配Android 5.0
- 苹果屏幕录制没有声音_苹果手机屏幕不亮但有声音是怎么回事?不要慌,这样就可以解决...
- 关于field-of-view和receptive field
- 笔记本电脑连接宽带的时候报错(调制解调器报告了一个错误)(1024程序节纪念一下自己的最坑)
- 小米手机,xxx正在删除小米账户上的联系人
- [iPhone]解决:手指按住不动时,屏幕也会上下抖动
- 82. 采用 OPA5 开发支持页面跳转的 SAP UI5 集成测试用例
- 大战华为4年,香奈儿再次败诉!网友:你瞎还是我瞎?
- VBScript运行时错误处理
- Spark【案例】实现黑名单实时过滤