基本概念

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激活状态查询)相关推荐

  1. 基于Nodejs的心理咨询微信小程序的设计和实现

    <基于Nodejs的心理咨询微信小程序的设计和实现>该项目采用技术Nodejs.mysql数据库 ,项目含有源码.论文.PPT.配套开发软件.软件安装教程.项目发布教程.核心代码介绍视频等 ...

  2. vue.js反编译_基于electron-vue开发的微信小程序反编译客户端

    开源一个小程序反编译客户端 咨询小程序反编译的同学比较多,虽然有开源库但是还是有同学不清楚如何去操作,所以索性做了一个客户端方便进行小程序的反编译 # 技术选型 网上已经有大佬实现了C#版的反编译工具 ...

  3. 基于云开发的微信小程序:个人相册ByUestcXiye

    基于云开发的微信小程序:个人相册ByUestcXiye 作业要求 第一次作业 第二次作业 结课作业 小程序开发入门 开发前的准备 注册微信小程序 新建一个模板小程序 开通云开发服务 第一次作业 参考资 ...

  4. 基于微信药店药品商城小程序系统设计与实现 开题报告

      毕业论文 基于微信药店药品商城小程序 开题报告 学    院: 专    业: 年    级: 学生姓名: 指导教师: 黄菊华   XXXX大学本科生毕业论文(设计)开题报告书 姓   名 Xxx ...

  5. python点名代码_基于python tkinter的点名小程序功能的实例代码

    基于python tkinter的点名小程序功能的实例代码,花名册,次数,窗口,未找到,初始化 基于python tkinter的点名小程序功能的实例代码 易采站长站,站长之家为您整理了基于pytho ...

  6. 计算机键盘标注,你所不知道的 Windows 10 小诀窍:万能计算器、虚拟键盘、屏幕截图标注...

    原标题:你所不知道的 Windows 10 小诀窍:万能计算器.虚拟键盘.屏幕截图标注 Windows 10 里面有许多好用的小功能,只是藏得很深,平常你不一定会发现它,又或者可能是并没有特别标注出来 ...

  7. 《微信小程序-证件照换底色》之三:微信小程序接收django的图片并部署到windows服务器上

    实现小程序接收django的图片并部署到windows服务器上 继上一篇:用pycharm搭建django框架接收微信小程序的图片后续 链接: https://blog.csdn.net/qq_449 ...

  8. 跑鸭”微信小程序-一款基于校园跑步的社交小程序

    跑鸭:这是我的毕业设计,"跑鸭"微信小程序-一款基于校园跑步的社交小程序(实时里程配速.运动路径.整公里提醒.周榜月榜.打卡分享.热门推荐.线上活动.勋章墙.隐私设置),技术栈:V ...

  9. 基于云开发的微信小程序实战教程(二)

    基于云开发的微信小程序实战教程(二) 上篇文章中,简单介绍了下小程序云开发的概念,还有开发工具的安装和配置,云开发环境已经搭建完毕. 本章主要内容:微信开发者工具如何使用,小程序云开发的基础目录结构 ...

最新文章

  1. 读懂深度迁移学习,看这文就够了 | 赠书
  2. 命令行设置dns_网络感叹号dns未响应
  3. c 最大子序列和_最大子序列和暴力法、分治+递归法、妙法
  4. sqlserver 2008安装总是弹出重启提示
  5. 奇妙的安全旅行之DES算法(二)
  6. Fastify 系列教程三 (验证、序列化和生命周期)
  7. java分享第十六天( java读取properties文件的几种方法java配置文件持久化:static块的作用)...
  8. 在try中写了return,后面又写了finally,是先执行return还是先执行fianlly
  9. Spring 切面 注解模式-练习Demo
  10. Linux制作软盘镜像
  11. Arduino-定义串口
  12. 韩国NF功放芯片在音频音响领域的应用
  13. unity3d内建着色器源码解析(一)
  14. 阿里云服务器Ubuntu系统搭建mqtt服务器
  15. bestCoder 百度之星程序设计资格赛 1005下棋
  16. 迅雷看看引领高清内容多屏合一新趋势
  17. 丧尸,只要摧毁头部便会永久停止行动
  18. Arduino系列之米思齐旋钮控制LED灯亮度
  19. 2020 web前端面试题及答案大全
  20. 再见了 SELECT *!大厂的 MySQL 查询优化方案,确实牛逼!

热门文章

  1. 成绩排序的c语言算法,成绩排序系统(练习排序算法和复习C语言)
  2. java libpcap,Linux下编译安装libpcap
  3. css 图文 上下 居中,CSS垂直居中的6种方法
  4. [设计模式笔记]3.单例模式
  5. mysql服务器权限说明,MySQL用户权限管理详解
  6. 晶体封装越小esr越大_SuperFin晶体管技术加持!英特尔新一代10nm可媲美台积电5nm?...
  7. java 编写异常_Java基础编程之异常处理
  8. pip安装deb_趟坑:使用pip安装TensorFlow
  9. 高端计算机教室,又一所高端学校来了,能住校师资力量强大
  10. mysql实现日志系统_基于Hadoop/CloudBase/MySQL的日志分析系统的设计与实现