他来了,他来了,桌面图标一百种玩法第三种,桌面时钟。

学会了就发给女朋友玩吧,效果炫酷,学不了吃亏,学不了上当,走过路过不要错过。

老规矩,先看看视频效果。

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(&currentTime);p = localtime(&currentTime);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(&currentTime);p = localtime(&currentTime);//小时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++用桌面图标系列之三【整理-时钟】相关推荐

  1. Microsoft Hyper-V Server 2008 R2和SCVMM2012部署XenDesktop 5.6桌面虚拟化系列之三准备XenDesktop服务器...

    Microsoft Hyper-V Server 2008 R2和SCVMM2012 部署XenDesktop 5.6桌面虚拟化系列 之三准备XenDesktop服务器 接着上一篇文章内容<Mi ...

  2. 苹果手机透明桌面_原来通过桌面图标就能知道苹果手机真假!涨见识了

    苹果手机一直以良好的操作体验深受用户喜爱,但由于苹果手机都比较昂贵,假货成风,很多朋友都害怕自己买到了假货. 其实大家可以通过桌面上的图标就能分辨苹果手机真假,下面就带大家一起去看看,非常涨见识哦! ...

  3. 用 C++ 在Windows中清空回收站内文件/隐藏和显示桌面图标 / Windows任务栏 / 任务栏时钟 / 更改桌面壁纸

    如果感觉这篇文章帮助到你的话,欢迎捐助我! bitcoin : bc1qvvkqmwcd7s9fas063htffm76k63rx7f3r9dp4r 清空回收站内文件 #include<wind ...

  4. C++桌面图标游戏系列之二【俄罗斯方块】

    最近写了一个C++桌面图标游戏系列之一[贪吃蛇]. https://blog.csdn.net/Yang9325/article/details/111031297 没想到还挺受欢迎,那么系列之二[俄 ...

  5. el-table 树形表格 自定义展开图标_Fences: 正版桌面图标自动整理栅栏工具 非Steam版...

    Fences 是知名开发商 Stardock 为 Windows 用户打造的一款经典的桌面管理工具.Fences 通过在桌面自由创建可命名的半透明区域给图标分组,并且在你不需要时隐藏它们.Fences ...

  6. 计算机桌面显示360,我笔记本电脑扩展了一个显示器,但是再开机后360桌面图标不能显示归集整理框里,全铺开了...

    网友求助:我笔记本电脑扩展了一个显示器,但是再开机后360桌面图标不能显示归集整理框里,全铺开了 问题第一张是正常情况,文件夹和文件分两类归集起来.第二张是扩展显示器后,图标全铺开了,拔掉显示器就恢复 ...

  7. 我对锤子ROM 功能的看法——功能篇——高效整理桌面图标

    我对锤子ROM 功能的看法--功能篇--高效整理桌面图标 高效整理桌面图标 老罗:"锤子Rom的Launcher执行效率超过iPhone连到电脑上的5个屏幕." 在一个页面中移动一 ...

  8. 正版推荐 - Fences 4 – 让你的桌面更加整洁与高效的桌面图标文件整理工具软件!

    你的电脑桌面总是杂乱无序?你需要专业的整理工具来帮你管理桌面图标和文件?Fences 4 是你的最佳选择! Fences 4 是一款功能强大.多样化的桌面图标整理工具软件.它可以帮助你轻松整理和管理桌 ...

  9. 【QA】Windows桌面图标整理美化(无需安装额外的软件,Windows自带)

    Question描述 如何整理桌面图标,但又不需要安装额外的软件? Answer细节 possibility answer 1 把所有桌面图标放在"屏幕"上 2 右击任务栏,选择工 ...

最新文章

  1. redis geohash 学习笔记
  2. Git系列之git log高级命令
  3. pyqt5 qscrollarea到达_在PYQT5中QscrollArea(滚动条)的使用方法
  4. 郑州计算机单招学校有哪些专业,郑州单招的学校有哪些专业
  5. 利用 PGO 提升 .NET 程序性能
  6. 解决添加Com引用 生成的Interop.*.dll 版本号永远是1.0的问题
  7. x86-64寄存器与栈帧(转载)
  8. Spring事务管理1-------环境搭建
  9. java 中特殊的_Java中一些特殊关键字
  10. mysql基础知识(二)
  11. YouTube架构学习
  12. 自动化Python+selenium 用这一篇学习就够了
  13. 数学建模——多属性决策模型
  14. CrazyTalk Animator 3 for Mac破解版永久激活方法附破解补丁
  15. acceleration transducer
  16. 将windows 8安装到U盘随身带!
  17. Boggle问题积累
  18. 青少年编程教育等级评测(一级)模拟题_1
  19. Worktile官网下载
  20. 手机页面h5的简单demo

热门文章

  1. android os 1.5 下载地址,技德Remix OS 1.5发布 适配Android 5.0
  2. 苹果屏幕录制没有声音_苹果手机屏幕不亮但有声音是怎么回事?不要慌,这样就可以解决...
  3. 关于field-of-view和receptive field
  4. 笔记本电脑连接宽带的时候报错(调制解调器报告了一个错误)(1024程序节纪念一下自己的最坑)
  5. 小米手机,xxx正在删除小米账户上的联系人
  6. [iPhone]解决:手指按住不动时,屏幕也会上下抖动
  7. 82. 采用 OPA5 开发支持页面跳转的 SAP UI5 集成测试用例
  8. 大战华为4年,香奈儿再次败诉!网友:你瞎还是我瞎?
  9. VBScript运行时错误处理
  10. Spark【案例】实现黑名单实时过滤