admin管理员组文章数量:1516870
一般隐藏/显示桌面图标的方法大多数人都知道了,只需要 “桌面右键→查看→显示桌面图标” 即可。如果这样已经满足你的要求,就不需要往下看了;如果你觉得多次点击麻烦,可以接着往下看
先说一下我写这个程序的目的
本人本就是一个追求简洁干净的男子,桌面只有几个常用软件和几个常用文件夹,大多数图标都放在“开始”屏幕,和同事相比我的桌面真是清清爽爽,可谓是一股清流;可是公司竟要把我逼上绝路,要求桌面软件只能有此电脑、网络、浏览器等图标,还不准有文件夹!
作为一个有原则的人,怎么可能随随便便改变自己的习惯,于是乎,为了应付检查,我写了这个快速隐藏/显示桌面图标的程序,然后将程序固定到“开始”屏幕里,只要来检查,打开“开始”,再轻轻一点,桌面瞬间清空,完美。
本程序使用C语言编写,调用的Windows API,所以只能在windows上运行
本程序无界面,启动后直接隐藏/显示桌面图标,运行结束后自动退出
操作系统:windows 10
开发工具:Visual Studio 2019
下面先贴源代码:
(以下是旧程序,可能不可用,新程序在后面)
#include<stdio.h>#include<Windows.h>#include<WinUser.h>#pragmacomment( linker,"/subsystem:windows /entry:mainCRTStartup")// 设置入口地址,为了隐藏控制台黑框,调试时黑框不会消失,运行exe文件时才能隐藏黑框intmain(void){
HWND hWndPm, hWndPm2, hWndDeskop;
hWndPm =FindWindowA(NULL,"Program Manager");//获取桌面句柄if(hWndPm !=0){
hWndPm2 =FindWindowExA(hWndPm,0,NULL,"");//获取 hWndPm 的子句柄if(hWndPm2 !=0){
hWndDeskop =FindWindowExA(hWndPm2,0,NULL,"FolderView");//获取 hWndPm2 的子句柄if(hWndDeskop !=0){//!!!以下三种方式不可同时使用!!!/*
* 如果仅隐藏桌面图标,使用下面程序
*///if (IsWindowVisible(hWndDeskop))//{// ShowWindow(hWndDeskop, SW_HIDE);//}/*
* 如果仅显示桌面图标,使用下面程序
*///if (!IsWindowVisible(hWndDeskop))//{// ShowWindow(hWndDeskop, SW_SHOW);//}/*
* 如果需要隐藏-显示桌面图标,使用下面程序
* 可以在 隐藏-显示 之间循环切换
*///if (IsWindowVisible(hWndDeskop))//{// ShowWindow(hWndDeskop, SW_HIDE);//}//else//{// ShowWindow(hWndDeskop, SW_SHOW);//}//!!!以上三种方式不可同时使用!!!/*
* 下面程序为模拟 “Win+D” 快捷键,显示桌面
* 可根据需要添加
*///Sleep(100);//keybd_event(VK_LWIN, 0, 0, 0); //按下 Win 键//keybd_event('D', 0, 0, 0); //按下 D 键//Sleep(100);//keybd_event(VK_LWIN,0, KEYEVENTF_KEYUP,0); //抬起 Win 键//keybd_event('D', 0, KEYEVENTF_KEYUP, 0); //抬起 D 键}else{printf("hWndDeskop未找到!\n");}}else{printf("hWndPm2未找到!\n");}}else{printf("hWndPm未找到!\n");}return0;}
20210811更新如下:
旧程序不可用的原因就是句柄路径发生了变化,新程序遍历了所有路径找桌面句柄。
并且新程序新增了隐藏任务栏的功能。
#include<stdio.h>#include<windows.h>#include<WinUser.h>#pragmacomment( linker,"/subsystem:windows /entry:mainCRTStartup")// 设置入口地址//遍历全部子窗口的子窗口 , Z序遍历
HWND findChildWindowHandleByName(HWND parent,int level, TCHAR* winNameBuf){
HWND child =NULL;
HWND hWnd =NULL;
TCHAR buf[MAX_PATH];
DWORD pid =0, tid =0;do{
child =FindWindowEx(parent, child,NULL,NULL);int ret =GetWindowText(child, buf, MAX_PATH);
buf[ret]=0;
tid =GetWindowThreadProcessId(child,&pid);for(int i =0; i < level;++i)printf("\t");printf("%s , pid:%d, tid:%d\n", buf, pid, tid);if(memcmp(winNameBuf, buf,sizeof(winNameBuf))==0){
hWnd = child;return hWnd;}if(child)
hWnd =findChildWindowHandleByName(child, level +1, winNameBuf);if(hWnd !=NULL){return hWnd;}}while(child);returnNULL;}//遍历全部 explore 下的窗口 , Z序遍历
HWND findWindowHandleByName(TCHAR* winNameBuf){
HWND child =NULL;
HWND hWnd =NULL;
TCHAR buf[MAX_PATH];
DWORD pid =0, tid =0;do{//查找 Explore 下的一个窗口,若是能找到则根据 Explore 下的child 继续找
child =FindWindowEx(NULL, child,NULL,NULL);int ret =GetWindowText(child, buf, MAX_PATH);
buf[ret]=0;
tid =GetWindowThreadProcessId(child,&pid);printf("%s , pid:%d, tid:%d\n", buf, pid, tid);if(memcmp(winNameBuf, buf,sizeof(winNameBuf))==0){
hWnd = child;return hWnd;}//遍历子窗口们if(child)
hWnd =findChildWindowHandleByName(child,1, winNameBuf);if(hWnd !=NULL){return hWnd;}}while(child);returnNULL;}intmain(void){
HWND hWnd =NULL;
HWND hWnd2 =NULL;
TCHAR desktopNameBuf[]={ L"FolderView"};// 桌面句柄名// 遍历桌面句柄
hWnd =findWindowHandleByName(desktopNameBuf);if(hWnd !=NULL){// 切换显示与隐藏桌面if(IsWindowVisible(hWnd)){ShowWindow(hWnd, SW_HIDE);}else{ShowWindow(hWnd, SW_SHOW);}// 模拟按键 Win+D//Sleep(100);//keybd_event(VK_LWIN, 0, 0, 0);//keybd_event('D', 0, 0, 0);//Sleep(100);//keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0);//keybd_event('D', 0, KEYEVENTF_KEYUP, 0);}// 根据任务栏类名寻找句柄
hWnd =FindWindowEx(NULL,NULL, L"Shell_TrayWnd",NULL);if(hWnd !=NULL){// 寻找是否有第二个屏幕的任务栏
hWnd2 =FindWindowEx(NULL,NULL, L"Shell_SecondaryTrayWnd",NULL);if(hWnd2 !=NULL){// 切换显示与隐藏任务栏if(IsWindowVisible(hWnd)){ShowWindow(hWnd, SW_HIDE);ShowWindow(hWnd2, SW_HIDE);// 第二屏幕任务栏需单独隐藏}else{ShowWindow(hWnd, SW_SHOW);// 显示第一屏幕任务栏后,第二屏幕任务栏会自动显示}}}return0;}遍历部分参考了该文章:
不想自己编译的,我提供了打包好的exe文件:
本程序未在其他PC测试,打包的exe不知道好不好使(反正也不一定有人用,懒得测试了),如果无法运行,欢迎留言,我再改进一下。
版权声明:本文标题:深度探索:用C语言编写脚本实现任务栏与隐藏图标的操控 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.betaflare.com/web/1772217412a3272376.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。


发表评论