写点什么
OpenHarmony 算法 元宇宙 MySQL 移动开发 学习方法 Web3.0 高效工作 数据库 Python 音视频 前端 AI 大数据 团队管理 程序员 运维 深度思考 低代码 redis golang 微服务架构 flutter 查看更多

C++ 实现一键关闭桌面

作者: 向阳逐梦
  • 2023-08-11
    四川
  • 本文字数:3095 字

    阅读完需:约 10 分钟

C++实现一键关闭桌面

方法一:

C++关闭桌面,explorer.exe


#include<Windows.h>#include <TlHelp32.h>#include"resource.h"#pragma warning(disable:4996)void taskkill(const char * name){	HANDLE info_handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //拍摄系统中所有进程的快照	if (info_handle == INVALID_HANDLE_VALUE)	{		MessageBox(0, TEXT("获取进程句柄失败!"), TEXT("错误"), 0);		return;	}
PROCESSENTRY32W program_info; program_info.dwSize = sizeof(PROCESSENTRY32W); //设置结构体大小 int bResult = Process32FirstW(info_handle, &program_info); //获取所有进程中第一个进程的信息 if (!bResult) { MessageBox(0, TEXT("获取进程句柄失败!"), TEXT("错误"), 0); return; } char tmp[MAX_PATH]; HANDLE hProcess; while (bResult) { wchar_t *pro_name = program_info.szExeFile; wcstombs(tmp, pro_name, MAX_PATH); if (!strcmp(tmp, name)) { hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, program_info.th32ProcessID); if (hProcess) { TerminateProcess(hProcess, 0); CloseHandle(hProcess);//OpenProcess打开的也要关闭 } break; } //获得下一个进程的进程信息 bResult = Process32Next(info_handle, &program_info); } CloseHandle(info_handle);//关闭句柄}int WINAPI WinMain(HINSTANCE h1, HINSTANCE h2, LPSTR cmd, int show){ taskkill("explorer.exe");}
复制代码

方法二:

C++ 一键关闭屏幕


#include <windows.h>#include "resource.h"
LRESULT CALLBACK WindowProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter );
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ // 延时防止双击exe关闭屏幕后,又打开屏幕。关闭屏幕的消息,先于系统的双击消息; Sleep(200);
::SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM)2);
static TCHAR szAppName[] = TEXT("HelloWin");
WNDCLASS wndClass; wndClass.style = CS_HREDRAW | CS_VREDRAW; wndClass.lpfnWndProc = WindowProc; wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.hInstance = hInstance; wndClass.hIcon = LoadIcon(hInstance, (char*)IDI_ICON1); wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndClass.lpszMenuName = NULL; wndClass.lpszClassName = szAppName;
if (!RegisterClass(&wndClass)) { MessageBox(NULL, TEXT("注册窗口失败!"), TEXT(""), 0); return 0; }
HWND hWnd = CreateWindow(szAppName, TEXT("Hello Program"), WS_OVERLAPPEDWINDOW, 0, 0, 0, 0, NULL, NULL, hInstance, NULL);
::SendMessage(hWnd, WM_DESTROY, 0, NULL); return 0;}
LRESULT CALLBACK WindowProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ){ HDC hdc; PAINTSTRUCT ps; RECT rect;
switch (uMsg) { case WM_DESTROY: PostQuitMessage(0); return 0; }
return DefWindowProc(hwnd, uMsg, wParam, lParam);}
复制代码

本程序使用 C 语言编写,调用的 Windows API,所以只能在 windows 上运行

本程序无界面,启动后直接隐藏/显示桌面图标,运行结束后自动退出

操作系统:windows 10

开发工具:Visual Studio 2019

下面先贴源代码:

#include <stdio.h>#include <windows.h>#include <WinUser.h>#pragma comment( 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); return NULL;}
//遍历全部 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); return NULL;}
int main(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); // 显示第一屏幕任务栏后,第二屏幕任务栏会自动显示 } } }
return 0;}

复制代码

新程序新增了隐藏任务栏的功能。


发布于: 刚刚阅读数: 4
用户头像

向阳逐梦

关注

人生享受编程,编程造就人生! 2022-06-01 加入

某公司芯片测试工程师,嵌入式开发工程师,InfoQ签约作者,阿里云星级博主,华为云·云享专家。座右铭:向着太阳,追逐梦想!

评论

发布
暂无评论
C++实现一键关闭桌面_向阳逐梦_InfoQ写作社区

哆哆女性网柘城辣椒价格广州军区武汉总医院50字的读后感微信网站制作的三月份生的宝宝起小名友情作文500字作文农业类网站设计广州企业网站设计方案国学经典起名男孩有备而来大国崛起纪录片观后感800字杜俊泽主演的电视剧电子商务 网站设计深圳关键词营销seo公司泊头网站建设泊头关于父亲的作文外面下着雨犹如我心血在滴睢县在河南什么地方网站seo能力要求北京高端建设网站博客网站建设模板平面设计优秀网站单页网站制作教程梦见很多蛇是什么预兆周公解梦十堰网站建设选微天0719web0663活动内刊设计网站石家庄网站设计培训学校拓展公司起名大全苏州网站设计公司淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻不负春光新的一天从800个哈欠开始有个姐真把千机伞做出来了国产伟哥去年销售近13亿充个话费竟沦为间接洗钱工具重庆警方辟谣“男子杀人焚尸”男子给前妻转账 现任妻子起诉要回春分繁花正当时呼北高速交通事故已致14人死亡杨洋拄拐现身医院月嫂回应掌掴婴儿是在赶虫子男孩疑遭霸凌 家长讨说法被踢出群因自嘲式简历走红的教授更新简介网友建议重庆地铁不准乘客携带菜筐清明节放假3天调休1天郑州一火锅店爆改成麻辣烫店19岁小伙救下5人后溺亡 多方发声两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#青海通报栏杆断裂小学生跌落住进ICU代拍被何赛飞拿着魔杖追着打315晚会后胖东来又人满为患了当地回应沈阳致3死车祸车主疑毒驾武汉大学樱花即将进入盛花期张立群任西安交通大学校长为江西彩礼“减负”的“试婚人”网友洛杉矶偶遇贾玲倪萍分享减重40斤方法男孩8年未见母亲被告知被遗忘小米汽车超级工厂正式揭幕周杰伦一审败诉网易特朗普谈“凯特王妃P图照”考生莫言也上北大硕士复试名单了妈妈回应孩子在校撞护栏坠楼恒大被罚41.75亿到底怎么缴男子持台球杆殴打2名女店员被抓校方回应护栏损坏小学生课间坠楼外国人感慨凌晨的中国很安全火箭最近9战8胜1负王树国3次鞠躬告别西交大师生房客欠租失踪 房东直发愁萧美琴窜访捷克 外交部回应山西省委原副书记商黎光被逮捕阿根廷将发行1万与2万面值的纸币英国王室又一合照被质疑P图男子被猫抓伤后确诊“猫抓病”

哆哆女性网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化