Visual C++ MFC——基于Shell的Windows GUI小程序DEMO(打开计算器|打开记事本|IP查询|Windows激活状态查询)
基本概念
Shell:
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
API
#include "stdio.h" //输入和输出
#include "assert.h" //用于验证程序做出的假设,并在假设为假时输出诊断消息。
#include "windows.h" //window程序需要的重要头文件,封装了许多库函数以及一些类,将一些复杂的工作由库函数处理。
#include "shellapi.h" //Shell API
开发环境
Visual Studio 2019
操作步骤
1、创建新项目
2、打开资源视图
视图->其他视图->资源视图
快捷键:Ctrl+Shift+E
3、新建对话框
4、GUI设计
注:
1、在属性栏中找到对应的Caption属性便可以修改显示文字
2、点击左侧的工具箱,可以拖动Button控件到界面上
源代码
分析菜单选择
// 分析菜单选择:switch (wmId){case IDM_ABOUT:DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);break;case IDM_TOOL:DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, Tool);break;case IDM_EXIT:DestroyWindow(hWnd);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}
消息处理
// “工具”框的消息处理程序。
INT_PTR CALLBACK Tool(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{UNREFERENCED_PARAMETER(lParam);printf("%ud",message);switch (message){case WM_INITDIALOG:return (INT_PTR)TRUE;case WM_COMMAND:if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL){EndDialog(hDlg, LOWORD(wParam));return (INT_PTR)TRUE;}else if (LOWORD(wParam) == IDC_BUTTON1) {HINSTANCE hRslt = ShellExecute(NULL, _T("open"),_T("calc.exe"), NULL, NULL, SW_SHOWNORMAL);assert(hRslt > (HINSTANCE)HINSTANCE_ERROR);}else if (LOWORD(wParam) == IDC_BUTTON2) {HINSTANCE hRslt = ShellExecute(NULL, _T("open"),_T("notepad.EXE"), NULL, NULL, SW_SHOWNORMAL);assert(hRslt > (HINSTANCE)HINSTANCE_ERROR);}else if (LOWORD(wParam) == IDC_BUTTON3) {HINSTANCE hRslt = ShellExecute(NULL, _T("open"),_T("Nslookup.EXE"), NULL, NULL, SW_SHOWNORMAL);assert(hRslt > (HINSTANCE)HINSTANCE_ERROR);}else if (LOWORD(wParam) == IDC_BUTTON4) {HINSTANCE hRslt = ShellExecute(NULL, _T("open"),_T("slmgr.vbs"), L"-xpr", NULL, SW_SHOWNORMAL);assert(hRslt > (HINSTANCE)HINSTANCE_ERROR);}break;}return (INT_PTR)FALSE;
}
全部主要代码
// Project3.cpp : 定义应用程序的入口点。
//#include "framework.h"
#include "Project3.h"
#include "stdio.h"
#include "assert.h"
#include "windows.h "
#include "shellapi.h " #define MAX_LOADSTRING 100// 全局变量:
HINSTANCE hInst; // 当前实例
WCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
WCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名// 此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK Tool(HWND, UINT, WPARAM, LPARAM);int APIENTRY wWinMain(_In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_ LPWSTR lpCmdLine,_In_ int nCmdShow)
{UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);// TODO: 在此处放置代码。// 初始化全局字符串LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);LoadStringW(hInstance, IDC_PROJECT3, szWindowClass, MAX_LOADSTRING);MyRegisterClass(hInstance);// 执行应用程序初始化:if (!InitInstance (hInstance, nCmdShow)){return FALSE;}HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_PROJECT3));MSG msg;// 主消息循环:while (GetMessage(&msg, nullptr, 0, 0)){if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){TranslateMessage(&msg);DispatchMessage(&msg);}}return (int) msg.wParam;
}//
// 函数: MyRegisterClass()
//
// 目标: 注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{WNDCLASSEXW wcex;wcex.cbSize = sizeof(WNDCLASSEX);wcex.style = CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc = WndProc;wcex.cbClsExtra = 0;wcex.cbWndExtra = 0;wcex.hInstance = hInstance;wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_PROJECT3));wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_PROJECT3);wcex.lpszClassName = szWindowClass;wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));return RegisterClassExW(&wcex);
}//
// 函数: InitInstance(HINSTANCE, int)
//
// 目标: 保存实例句柄并创建主窗口
//
// 注释:
//
// 在此函数中,我们在全局变量中保存实例句柄并
// 创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{hInst = hInstance; // 将实例句柄存储在全局变量中HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);if (!hWnd){return FALSE;}ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);return TRUE;
}//
// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 目标: 处理主窗口的消息。
//
// WM_COMMAND - 处理应用程序菜单
// WM_PAINT - 绘制主窗口
// WM_DESTROY - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{switch (message){case WM_COMMAND:{int wmId = LOWORD(wParam);// 分析菜单选择:switch (wmId){case IDM_ABOUT:DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);break;case IDM_TOOL:DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, Tool);break;case IDM_EXIT:DestroyWindow(hWnd);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}}break;case WM_PAINT:{PAINTSTRUCT ps;RECT rect;HDC hdc = BeginPaint(hWnd, &ps);// TODO: 在此处添加使用 hdc 的任何绘图代码...GetClientRect(hWnd, &rect); DrawText(hdc, TEXT("Hello World!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);EndPaint(hWnd, &ps);}break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}return 0;
}// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{UNREFERENCED_PARAMETER(lParam);switch (message){case WM_INITDIALOG:return (INT_PTR)TRUE;case WM_COMMAND:if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL){EndDialog(hDlg, LOWORD(wParam));return (INT_PTR)TRUE;}break;}return (INT_PTR)FALSE;
}// “工具”框的消息处理程序。
INT_PTR CALLBACK Tool(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{UNREFERENCED_PARAMETER(lParam);printf("%ud",message);switch (message){case WM_INITDIALOG:return (INT_PTR)TRUE;case WM_COMMAND:if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL){EndDialog(hDlg, LOWORD(wParam));return (INT_PTR)TRUE;}else if (LOWORD(wParam) == IDC_BUTTON1) {HINSTANCE hRslt = ShellExecute(NULL, _T("open"),_T("calc.exe"), NULL, NULL, SW_SHOWNORMAL);assert(hRslt > (HINSTANCE)HINSTANCE_ERROR);}else if (LOWORD(wParam) == IDC_BUTTON2) {HINSTANCE hRslt = ShellExecute(NULL, _T("open"),_T("notepad.EXE"), NULL, NULL, SW_SHOWNORMAL);assert(hRslt > (HINSTANCE)HINSTANCE_ERROR);}else if (LOWORD(wParam) == IDC_BUTTON3) {HINSTANCE hRslt = ShellExecute(NULL, _T("open"),_T("Nslookup.EXE"), NULL, NULL, SW_SHOWNORMAL);assert(hRslt > (HINSTANCE)HINSTANCE_ERROR);}else if (LOWORD(wParam) == IDC_BUTTON4) {HINSTANCE hRslt = ShellExecute(NULL, _T("open"),_T("slmgr.vbs"), L"-xpr", NULL, SW_SHOWNORMAL);assert(hRslt > (HINSTANCE)HINSTANCE_ERROR);}break;}return (INT_PTR)FALSE;
}
运行结果
参考文章
https://blog.csdn.net/zmdsjtu/article/details/52311107
https://www.cnblogs.com/hengxilee/articles/5432496.html
https://blog.csdn.net/Jailman/article/details/86690444
Visual C++ MFC——基于Shell的Windows GUI小程序DEMO(打开计算器|打开记事本|IP查询|Windows激活状态查询)相关推荐
- 基于Nodejs的心理咨询微信小程序的设计和实现
<基于Nodejs的心理咨询微信小程序的设计和实现>该项目采用技术Nodejs.mysql数据库 ,项目含有源码.论文.PPT.配套开发软件.软件安装教程.项目发布教程.核心代码介绍视频等 ...
- vue.js反编译_基于electron-vue开发的微信小程序反编译客户端
开源一个小程序反编译客户端 咨询小程序反编译的同学比较多,虽然有开源库但是还是有同学不清楚如何去操作,所以索性做了一个客户端方便进行小程序的反编译 # 技术选型 网上已经有大佬实现了C#版的反编译工具 ...
- 基于云开发的微信小程序:个人相册ByUestcXiye
基于云开发的微信小程序:个人相册ByUestcXiye 作业要求 第一次作业 第二次作业 结课作业 小程序开发入门 开发前的准备 注册微信小程序 新建一个模板小程序 开通云开发服务 第一次作业 参考资 ...
- 基于微信药店药品商城小程序系统设计与实现 开题报告
毕业论文 基于微信药店药品商城小程序 开题报告 学 院: 专 业: 年 级: 学生姓名: 指导教师: 黄菊华 XXXX大学本科生毕业论文(设计)开题报告书 姓 名 Xxx ...
- python点名代码_基于python tkinter的点名小程序功能的实例代码
基于python tkinter的点名小程序功能的实例代码,花名册,次数,窗口,未找到,初始化 基于python tkinter的点名小程序功能的实例代码 易采站长站,站长之家为您整理了基于pytho ...
- 计算机键盘标注,你所不知道的 Windows 10 小诀窍:万能计算器、虚拟键盘、屏幕截图标注...
原标题:你所不知道的 Windows 10 小诀窍:万能计算器.虚拟键盘.屏幕截图标注 Windows 10 里面有许多好用的小功能,只是藏得很深,平常你不一定会发现它,又或者可能是并没有特别标注出来 ...
- 《微信小程序-证件照换底色》之三:微信小程序接收django的图片并部署到windows服务器上
实现小程序接收django的图片并部署到windows服务器上 继上一篇:用pycharm搭建django框架接收微信小程序的图片后续 链接: https://blog.csdn.net/qq_449 ...
- 跑鸭”微信小程序-一款基于校园跑步的社交小程序
跑鸭:这是我的毕业设计,"跑鸭"微信小程序-一款基于校园跑步的社交小程序(实时里程配速.运动路径.整公里提醒.周榜月榜.打卡分享.热门推荐.线上活动.勋章墙.隐私设置),技术栈:V ...
- 基于云开发的微信小程序实战教程(二)
基于云开发的微信小程序实战教程(二) 上篇文章中,简单介绍了下小程序云开发的概念,还有开发工具的安装和配置,云开发环境已经搭建完毕. 本章主要内容:微信开发者工具如何使用,小程序云开发的基础目录结构 ...
最新文章
- 读懂深度迁移学习,看这文就够了 | 赠书
- 命令行设置dns_网络感叹号dns未响应
- c 最大子序列和_最大子序列和暴力法、分治+递归法、妙法
- sqlserver 2008安装总是弹出重启提示
- 奇妙的安全旅行之DES算法(二)
- Fastify 系列教程三 (验证、序列化和生命周期)
- java分享第十六天( java读取properties文件的几种方法java配置文件持久化:static块的作用)...
- 在try中写了return,后面又写了finally,是先执行return还是先执行fianlly
- Spring 切面 注解模式-练习Demo
- Linux制作软盘镜像
- Arduino-定义串口
- 韩国NF功放芯片在音频音响领域的应用
- unity3d内建着色器源码解析(一)
- 阿里云服务器Ubuntu系统搭建mqtt服务器
- bestCoder 百度之星程序设计资格赛 1005下棋
- 迅雷看看引领高清内容多屏合一新趋势
- 丧尸,只要摧毁头部便会永久停止行动
- Arduino系列之米思齐旋钮控制LED灯亮度
- 2020 web前端面试题及答案大全
- 再见了 SELECT *!大厂的 MySQL 查询优化方案,确实牛逼!
热门文章
- 成绩排序的c语言算法,成绩排序系统(练习排序算法和复习C语言)
- java libpcap,Linux下编译安装libpcap
- css 图文 上下 居中,CSS垂直居中的6种方法
- [设计模式笔记]3.单例模式
- mysql服务器权限说明,MySQL用户权限管理详解
- 晶体封装越小esr越大_SuperFin晶体管技术加持!英特尔新一代10nm可媲美台积电5nm?...
- java 编写异常_Java基础编程之异常处理
- pip安装deb_趟坑:使用pip安装TensorFlow
- 高端计算机教室,又一所高端学校来了,能住校师资力量强大
- mysql实现日志系统_基于Hadoop/CloudBase/MySQL的日志分析系统的设计与实现