创建 Win32 应用程序
用 VC++建立 Windows 服务程序
用VC++建立Windows 服务程序本文主要介绍了OpenSCManager、CreateService、OpenService、ControlService、DeleteService、RegisterServiceCtrlHandler、SetServiceStatus、StartServiceCtrlDispatcher等操作服务程序的主要几个API的用法,具体的函数参数大家可以查阅MSDN。
为什么要使用服务应该程序呢?服务程序就像系统的一些服务一样,能够自动地启动,并执行相应的操作;而且因为服务程序的在层次上和一般的应用程序不同,其能够在系统启动时就自动地运行,而不像一般的应用程序那样一定要在登陆后才能运行,这些就是服务的一些好处了,如果你也想你的程序具有这样的功能,那么你就可以建立一个服务应用程序了。
下面就跟着我一步一步地教你怎么去创建一个服务应用程序吧。
一、建立Win32 Application 应用程序(当然你也可以建立其它的应用程序,但服务一般是没有用户界面的),并命名为ServiceTest。
二、定义全局函数变量。
这里主要是设置服务句柄和状态。
print?01.BOOL IsInstalled();02.BOOL Install();03.BOOL Uninstall();04.void LogEvent(LPCTSTR pszFormat, ...);05.void WINAPI ServiceMain();06.void WINAPI ServiceStrl(DWORD dwOpcode);07.08.TCHAR szServiceName[] = _T("ServiceTest");09.BOOL bInstall;10.SERVICE_STATUS_HANDLE hServiceStatus;11.SERVICE_STATUS status;12.DWORD dwThreadID;三、添加Init初始化函数。
(完整word版)操作系统实验报告.实验一 WINDOWS进程初识
操作系统教程实验指导书实验一WINDOWS进程初识1、实验目的(1)学会使用VC编写基本的Win32 Consol Application(控制台应用程序)。
(2)掌握WINDOWS API的使用方法。
(3)编写测试程序,理解用户态运行和核心态运行。
2、实验内容和步骤(1)编写基本的Win32 Consol Application步骤1:登录进入Windows,启动VC++ 6.0。
步骤2:在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32 Consol Application”,然后在“Project name”处输入工程名,在“Location”处输入工程目录。
创建一个新的控制台应用程序工程。
步骤3:在“FILE”菜单中单击“NEW”子菜单,在“Files”选项卡中选择“C++ Source File”, 然后在“File”处输入C/C++源程序的文件名。
步骤4:将清单1-1所示的程序清单复制到新创建的C/C++源程序中。
编译成可执行文件。
步骤5:在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows “命令提示符”窗口,然后进入工程目录中的debug子目录,执行编译好的可执行程序:E:\课程\os课\os实验\程序\os11\debug>hello.exe运行结果 (如果运行不成功,则可能的原因是什么?) :答:运行成功,结果:(2)计算进程在核心态运行和用户态运行的时间步骤1:按照(1)中的步骤创建一个新的“Win32 Consol Application”工程,然后将清单1-2中的程序拷贝过来,编译成可执行文件。
步骤2:在创建一个新的“Win32 Consol Application”工程,程序的参考程序如清单1-3所示,编译成可执行文件并执行。
步骤3:在“命令提示符”窗口中运行步骤1中生成的可执行文件,测试步骤2中可执行文件在核心态运行和用户态运行的时间。
visual c++ 6.0的基本用法
Visual C++ 6.0 是一个非常经典的C++ 集成开发环境(IDE),虽然现在已经有了更新、更强大的版本,但很多老程序员或者对老版本有特殊需求的人仍然会使用它。
以下是一些Visual C++ 6.0 的基本用法:安装与启动:首先,从官方渠道下载Visual C++ 6.0 安装程序,并按照提示进行安装。
安装完成后,启动Visual C++ 6.0。
创建新项目:在文件菜单中选择“新建”,然后选择项目类型,例如“Win32 应用程序”。
为项目命名并选择保存位置。
在“Win32 应用程序向导”中,选择应用程序类型(如对话框应用、空项目等)。
编写代码:在打开的编辑器窗口中编写C++ 代码。
可以使用自动补全、语法高亮等功能提高编码效率。
编译与运行:编写完代码后,点击工具栏上的“构建”按钮或按F7 键进行编译。
如果编译成功,点击“运行”按钮或按F5 键运行程序。
调试:如果程序出现错误,可以使用调试功能进行排查。
设置断点,然后使用“开始调试”按钮或F5 键进入调试模式。
在调试模式下,可以使用步进、步出、查看变量值等功能进行调试。
资源管理:Visual C++ 6.0 自带资源编辑器,可以用来编辑和管理项目中的资源,如对话框、图标、位图等。
其他功能:使用“类向导”来管理项目中的类和消息处理函数。
使用“工具”菜单中的各项功能,如性能分析、错误查找等。
注意事项:Visual C++ 6.0 已经比较老旧,很多新的C++ 标准和特性可能不支持。
在使用过程中可能会遇到一些与现代操作系统不兼容的问题。
对于新手来说,可能会有更好的选择,例如Visual Studio Code 或更新版本的Visual Studio。
获取帮助:如果在使用过程中遇到问题,可以查阅官方文档或搜索相关教程和论坛来寻找答案。
升级与迁移:如果觉得Visual C++ 6.0 功能不足或与现代环境不兼容,可以考虑升级到更新版本的Visual Studio 或其他现代IDE。
vs2005入门使用
vs2005的初步使用今天安装了VS2005,也在网上查了一下,很乱,我就帮大家整理下,大家看下,基本的使用会没有什么问题的!不得不说VS2005很强大,但如何使用?这点很重要……呵呵!首先,我不知道什么创建WIN32控制台程序和WIN32应用程序。
感觉有点痛苦。
这里教下如何创建WIN32控制台程序和如果创建WIN32应用程序。
先说WIN32控制台程序1:文件 -> 新建 -> 项目2:“输入名称"是输入工程的名称,不必要加上后缀。
按“确定”后会出现如下图:但不要选择“完成”而是要选择“下一步”。
然后如下图:这里要选择“空项目”,应该说最好是选择“空项目”。
最后按“完成”。
这时候在“解决方案”上看到源文件,如下图:右击“源文件”后选择“添加”-> “新建项”。
然后弹出一个对话框,如下图:照上去的选择,然后输入文件名。
这个文件名就要加上后缀了。
想写C程序就加上C后缀,写C++程序后缀加不加都行,默认是.cpp后缀。
最后就把传说中的程序写上去。
就是HELLO WORLD程序。
然后运行,可报出无法找到msvcr80d.dll文件。
这时候只能去GOOGLE了。
下载一个msvcr80d.dll文件放到C:\WINDOW\SYSTEM32\目录下。
下载msvcr80d.dll文件后,要想运行程序,就按 工具 -> 开始执行(不调试),也就是Ctrl + F5。
OK,最后输出。
如下图:大家有没有发现最左边“源文件”那里虽然后缀是.C。
但它们的图片还是C++。
对于这点不要觉得奇怪。
以前在群里听人聊起的时候听说过,没什么大不了的事。
现在我也不记得了。
最后,OK,一个在VS2005下的WIN32程序运行完毕。
完毕是完毕了。
可大家有没有发觉我的代码比你们的漂亮多了。
主要是我下载了VS2005助手。
VS2005里有智能,但我不知道什么设置。
最后我去下载个和VC6一样的小助手。
只不过用在VS2005中。
操作系统实验参考代码
目录实验一WINDOWS进程初识 (2)实验二进程管理 (6)实验三进程同步的经典算法 (10)实验四存储管理 (14)试验五文件系统试验 (18)实验有关(参考)代码实验一WINDOWS进程初识1、实验目的(1)学会使用VC编写基本的Win32 Consol Application(控制台应用程序)。
(2)掌握WINDOWS API的使用方法。
(3)编写测试程序,理解用户态运行和核心态运行。
2、程序清单清单1-1 一个简单的Windows控制台应用程序// hello项目# include <iostream>void main(){std::cout << “Hello, Win32 Consol Application” << std :: endl ;}清单1-2 核心态运行和用户态运行时间比计算// proclist项目# include <windows.h># include <tlhelp32.h># include <iostream.h>// 当在用户模式机内核模式下都提供所耗时间时,在内核模式下进行所耗时间的64位计算的帮助方法DWORD GetKernelModePercentage(const FILETIME& ftKernel,const FILETIME& ftUser){// 将FILETIME结构转化为64位整数ULONGLONG qwKernel=(((ULONGLONG)ftKernel.dwHighDateTime)<<32)+ftKernel.dwLowDateTime;ULONGLONG qwUser=(((ULONGLONG)ftUser.dwHighDateTime)<<32)+ftUser.dwLowDateTime;// 将消耗时间相加,然后计算消耗在内核模式下的时间百分比ULONGLONG qwTotal=qwKernel+qwUser;DWORD dwPct=(DWORD)(((ULONGLONG)100*qwKernel)/qwTotal);return(dwPct);}// 以下是将当前运行过程名和消耗在内核模式下的时间百分数都显示出来的应用程序void main(int argc,char *argv[]){if(argc<2){cout<<"请给出你要查询的程序名"<<endl;exit(0);}// 对当前系统中运行的过程拍取“快照”HANDLE hSnapshot=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,// 提取当前过程0);// 如果是当前过程,就将其忽略// 初始化过程入口PROCESSENTRY32 pe;::ZeroMemory(&pe,sizeof(pe));pe.dwSize=sizeof(pe);BOOL bMore=::Process32First(hSnapshot,&pe);BOOL found = FALSE;while(bMore){// 打开用于读取的过程if(!strcmp(pe.szExeFile,argv[1])){found = TRUE;HANDLE hProcess=::OpenProcess(PROCESS_QUERY_INFORMA TION,// 指明要得到信息FALSE,// 不必继承这一句柄pe.th32ProcessID);// 要打开的进程if (hProcess!=NULL){// 找出进程的时间FILETIME ftCreation,ftKernelMode,ftUserMode,ftExit;::GetProcessTimes(hProcess,// 所感兴趣的进程&ftCreation,// 进程的启动时间&ftExit,// 结束时间(如果有的话)&ftKernelMode,// 在内核模式下消耗的时间&ftUserMode);// 在用户模式下消耗的时间// 计算内核模式消耗的时间百分比DWORD dwPctKernel=::GetKernelModePercentage(ftKernelMode,// 在内核模式上消耗的时间ftUserMode);// 在用户模式下消耗的时间// 向用户显示进程的某些信息cout<< "process ID: " << pe.th32ProcessID<< ",EXE file:" << pe.szExeFile<< ",%d in Kernel mode: " << dwPctKernel << endl;// 消除句柄::CloseHandle(hProcess);}}// 转向下一个进程bMore=::Process32Next(hSnapshot,&pe);}if(found==FALSE){cout<<"当前系统没有这个可执行程序正在运行"<<endl;exit(0);}}清单1-3 核心态运行和用户态运行时间测试程序#include <stdio.h>main(){int i,j;while(1){for(i=0;i<1000;i++);for(j=1;j<1000;j++) printf(“enter kernel mode running.”);}}实验二进程管理1、实验目的1) 通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows进程的“一生”。
第11章 Windows 编程初步-面向对象程序设计(C++语言)(第二版)-程磊-清华大学出版社
❖ 第一种方法的特点是可以使应用程序更精炼,运 行效率更高,编写程序时有较大的自由度,但难 度较大;
❖ 第二种方法的特点是采用MFC提供的类库编写程 序,这些类中已经封装了大部分的Windows API 函数,还提供了编写不同程序类型的模版和框架, 所以编写程序比较容易,而且还允许直接调用 Windows API 函数来实现一些特殊的功能。
第三部分 Visual C++环境下Windows程序 开发概述
第11章 Windows 编程初步 第12章 MFC库和应用程序框架 第13章 综合设计实例– 简单绘图程序
第11章 Windows 编程初步
本章要点:
❖简单的Windows程序框架 ❖自定义类和Windows程序框架结合
在编写Windows 应用程序时,常采用两种方法: ❖ 一是使用Windows SDK ( Software development Kit,即
图11.5 向解决方案中添加新项
图11.6 添加main.cpp文件
(6)可以看到在“解决方案管理器”视图中的“源文件” 栏目中被添加了一个main.cpp文件,同时可以看到 Visual Studio开发工具的中间编辑窗口也打开了一个空 白的文件编辑窗口,在这里输入例11.1的源程序,然后保 存,如图11.7所示。
❖ Windows程序一般是一个可视化的窗口程序,通过操作 系统发送的消息来处理用户输入的数据,然后通过在窗口 上绘制或者把数据发给窗口上的组件来显示数据。
❖ 句柄就是一个标识符,用来区别同类对象或者资源的唯一 标志,可以认为它是个无符号整数或者一个指针均可。
实验01 创建 Win32 应用程序
实验一、创建 Win32 应用程序Win32 API(也称为 Windows API)是用于创建 Windows 应用程序的基于 C 的框架,自 Windows 1.0 以来就已存在。
在Windows API中可以找到有关此 API 的大量文档。
在本过程中,我们将创建向窗口显示“Hello, World!”的简单 Win32应用程序。
过程中的步骤对于所有 Win32 应用程序都是相同的。
完成此过程后,您可以将这里创建的代码用作创建任何其他 Win32 应用程序的主干。
创建新的 Win32 项目1.在“文件”菜单上,单击“新建”,然后单击“项目...”。
2.在“项目类型”窗格中,选择“Visual C++”节点中的“Win32”,然后在“模板”窗格中选择“Win32 项目”。
键入项目的名称,如win32app。
您可以接受默认位置、键入一个位置或者导航到要保存项目的目录。
3.在“Win32 应用程序向导”中,选择“下一步”。
4.在“Win32 应用程序向导”中,在“应用程序类型”下选择“Windows 应用程序”。
在“附加选项”下选择不要勾选“空项目”。
原样保留剩余的选项。
单击“完成”创建项目。
5.在“生成”菜单中选择“生成解决方案”。
6.在“调试”菜单中选择“启动调试”。
观察程序的运行效果。
在所给"WinUI.chm"//windows下的标准帮助文件格式文件中查找RegisterClassEx、CreateWindow、ShowWindow等函数的文档,在所给"GDI.chm"中查找UpdateWindow等函数的文档。
并按要求修改源程序。
1、将窗口标题中的字符修改为"这是我的第一个窗口":在资源视图-->String table 中修改IDS_APP_TITLE的内容;2、修改窗口的图标(右上角)和最小化时的图标:在资源视图-->icon文件夹上右键菜单点击插入资源,在弹出窗口中选择icon,然后导入资源,选择两个不相同的图标(ico)文件,在属性窗口中修改资源ID;修改窗口类注册处的两个LoadIcon 函数中的ID,编译运行,观察左上角的图标和最小化的图标。
Visual Studio 2013 编程软件的使用详解
Visual Studio 2013 编程软件的使用详解Visual Studio 2013 – dektopVisual C++可以在微软官方站点直接下载最新的express版本,注册并且免费使用强大而灵活的 Visual C++ 语言和工具在 Visual Studio 允许在 .NET framework 上运行本机 Windows 应用商店 apps、本机桌面 apps 和托管 apps 的开发。
Visual C++ 包含以下元素:Visual Studio 开发环境开发环境通过编写代码以支持整个开发工作流,从创建和管理的项目,调试,进行分析并部署到最终用户。
可视化工具 C++compiler编译器支持本机代码以 .NET 公共语言运行时 (CLR) 的开发和开发。
VisualC++ 直接支持 x86 计算机的生成,并包括面向 x64 和 ARM 的编译器。
它优化所有平台的性能。
库C 运行库 (crt)包括安全增强选择要了解所造成安全问题的函数。
标准 C++ 库包含 (mfc) 库和标准模板库 (STL)。
活动模板库 (ATL)传递给 COM 组件和 apps 的创建。
Microsoft 基础类 (MFC) 库选件对的桌面 apps 创建具有传统或 Office 样式的用户界面。
并行模式库 (PPL)对 CPU 执行的异步和并行算法。
C++ AMP (C++ 加速的大量并行)对于大量在 GPU 执行的并行算法。
Windows 运行时 C++ 模板库 (WRL),为 Windows 应用商店 apps 和元素的 COM 样式的开发。
.NET framework 选件类库 (通过使用 C++/CLI),STL/CLR 和 C++ 支持库对托管 apps 的开发。
此外,在中,当使用 Visual C++ 时也可以访问 Windows 应用商店 apps 和桌面 apps 的 windows API。
win32 winmain 例子
win32 winmain 例子Win32 WinMain 例子什么是 Win32 WinMain?WinMain是一个用于创建 Windows 桌面应用程序的主函数。
它是一个程序的入口点,并负责初始化应用程序的状态,创建和显示主窗口,以及响应系统的消息。
示例 1:创建一个空白的窗口下面是一个简单的示例,演示了如何使用 Win32 API 创建一个空白的窗口:#include <>LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wPa ram, LPARAM lParam);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevI nstance, LPSTR lpCmdLine, int nCmdShow){const char CLASS_NAME[] = "Sample Window Class";const char WINDOW_TITLE[] = "Win32 Sample";// 注册窗口类WNDCLASS wc = { };= WndProc;= hInstance;= CLASS_NAME;RegisterClass(&wc);// 创建窗口HWND hwnd = CreateWindowEx(0, // 扩展窗口样式CLASS_NAME, // 窗口类名WINDOW_TITLE, // 窗口标题WS_OVERLAPPEDWINDOW, // 窗口样式CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_ USEDEFAULT, // 窗口位置和尺寸NULL, // 父窗口句柄NULL, // 菜单句柄hInstance, // 应用程序实例句柄NULL // 创建窗口时的额外数据);if (hwnd == NULL) {return 0;}// 显示窗口ShowWindow(hwnd, nCmdShow);UpdateWindow(hwnd);// 消息循环MSG msg;while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return ;}LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wPa ram, LPARAM lParam){switch (msg){case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd, msg, wParam, lParam);}示例 2:处理窗口消息以下是一个稍微复杂一些的示例,演示了如何处理窗口消息:#include <>// 窗口过程函数LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wPa ram, LPARAM lParam);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevI nstance, LPSTR lpCmdLine, int nCmdShow){const char CLASS_NAME[] = "Sample Window Class";const char WINDOW_TITLE[] = "Win32 Sample";// 注册窗口类WNDCLASS wc = { };= WndProc;= hInstance;= CLASS_NAME;RegisterClass(&wc);// 创建窗口HWND hwnd = CreateWindowEx(0, // 扩展窗口样式CLASS_NAME, // 窗口类名WINDOW_TITLE, // 窗口标题WS_OVERLAPPEDWINDOW, // 窗口样式CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_ USEDEFAULT, // 窗口位置和尺寸NULL, // 父窗口句柄NULL, // 菜单句柄hInstance, // 应用程序实例句柄NULL // 创建窗口时的额外数据);if (hwnd == NULL) {return 0;}// 显示窗口ShowWindow(hwnd, nCmdShow);UpdateWindow(hwnd);// 消息循环MSG msg;while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return ;}LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wPa ram, LPARAM lParam){// 自定义窗口消息处理switch (msg){case WM_CREATE:MessageBox(hwnd, "窗口创建", "消息", MB_OK); return 0;case WM_PAINT:{PAINTSTRUCT ps;HDC hdc = BeginPaint(hwnd, &ps);// 绘制文本RECT rect;GetClientRect(hwnd, &rect);DrawText(hdc, "Hello, Win32!", -1, &rect, DT _CENTER | DT_VCENTER | DT_SINGLELINE);EndPaint(hwnd, &ps);return 0;}case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd, msg, wParam, lParam);}这个示例演示了如何在窗口创建时显示一个消息框,并在窗口绘制时绘制一段文本。
第9章 Win32编程
第9章
Win32编程
9.1.1 Windows API的有关概念
Windows API都是以DLL输出函数的形式提供的, 大部分核心的API服务都在Kernel32.dll、GUI32.dll和 User32.dll三个文件内,它们位于Windows\System (Winnt\System32)目录内。还有许多重要的API函数在 Windows (Winnt)或Windows\System (Winnt\System32) 目录中的其它DLL文件内(本章第5节将介绍DLL)。这 些函数数量庞大,而且随着Windows版本的升级仍在 不断增加。对于普通程序员来说,不可能也没必要知 道每个API函数的用法,但应了解一些API的知识并且 能在需要时迅速查到自己感兴趣的API函数的资料。
GetActiveWindow、FindWindow等API函数取得其句柄。
第9章
Win32编程
下面一个例子是在当前Windows环境下查找一个标 题为“Hello”的窗口,如果查到该窗口,就将其标题 改为“How Are You”。 HWND hWnd ; if (hWnd = FindWindow (0, "Hello"))
判断一个窗口是否处于最小化状态
改变窗口的位置 改变窗口的位置和大小
第9章
Win32编程
BringWindowToTop FindWindow FlashWindow GetWindowText
将指定的窗口带到顶部 寻找符合某些条件的窗口 使指定的窗口闪烁显示 取窗口的标题或控件的内容
SetWindowText
运行外部应用程序 退出Windows并关闭或重新启动系统等 创建形状各异的窗口 打开剪贴板 清除剪贴板上的数据 关闭剪贴板
VS2019使用Windows桌面应用程序模块创建Win32窗口
VS2019使⽤Windows桌⾯应⽤程序模块创建Win32窗⼝本⽂介绍了VS2019使⽤Windows桌⾯应⽤程序模块创建Win32窗⼝,分享给⼤家,具体如下:头⽂件Project1.h:#pragma once#include "resource.h"实现⽂件Project1.cpp:// Project1.cpp : 定义应⽤程序的⼊⼝点。
//#include "framework.h"#include "Project1.h"#define MAX_LOADSTRING 100// 全局变量:HINSTANCE hInst; // 当前实例WCHAR szTitle[MAX_LOADSTRING]; // 标题栏⽂本 16位双字节字符WCHAR szWindowClass[MAX_LOADSTRING]; // 主窗⼝类名// 此代码模块中包含的函数的前向声明:ATOM MyRegisterClass(HINSTANCE hInstance); //返回unsigned short 2字节整数BOOL InitInstance(HINSTANCE, int);LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //返回long 4字节整数作地址INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); //返回int 4字节整数作地址int APIENTRY wWinMain(_In_ HINSTANCE hInstance, /*typedef void *HINSTANCE;句柄是⼀个⼆级指针*/_In_opt_ HINSTANCE hPrevInstance,_In_ LPWSTR lpCmdLine, /*wchar_t *LPWSTR 指向16位UNICODE宽字符的指针*/_In_ int nCmdShow){UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);// TODO: 在此处放置代码。
全新 Microsoft Visual Studio2013指南
Visual Studio 2013 – dektopVisual C++可以在微软官方站点直接下载最新的express版本,注册并且免费使用强大而灵活的 Visual C++ 语言和工具在 Visual Studio 允许在 .NET framework 上运行本机 Windows 应用商店 apps、本机桌面 apps 和托管 apps 的开发。
Visual C++ 包含以下元素:Visual Studio 开发环境开发环境通过编写代码以支持整个开发工作流,从创建和管理的项目,调试,进行分析并部署到最终用户。
可视化工具 C++compiler编译器支持本机代码以 .NET 公共语言运行时 (CLR) 的开发和开发。
VisualC++ 直接支持 x86 计算机的生成,并包括面向 x64 和 ARM 的编译器。
它优化所有平台的性能。
库C 运行库 (crt)包括安全增强选择要了解所造成安全问题的函数。
标准 C++ 库包含 (mfc) 库和标准模板库 (STL)。
活动模板库 (ATL)传递给 COM 组件和 apps 的创建。
Microsoft 基础类 (MFC) 库选件对的桌面 apps 创建具有传统或 Office 样式的用户界面。
并行模式库 (PPL)对 CPU 执行的异步和并行算法。
C++ AMP (C++ 加速的大量并行)对于大量在 GPU 执行的并行算法。
Windows 运行时 C++ 模板库 (WRL),为 Windows 应用商店 apps 和元素的 COM 样式的开发。
.NET framework 选件类库 (通过使用 C++/CLI),STL/CLR 和 C++ 支持库对托管 apps 的开发。
此外,在中,当使用 Visual C++ 时也可以访问 Windows 应用商店 apps 和桌面 apps 的 windows API。
标头文件和 .winmd 文件这些 API 的包含在 Visual Studio 中,在 Windows 软件开发包 (SDK)Windows 8的。
如何用VC创建及调用DLL
如何用VC创建及调用DLL使用Visual C++(VC++)创建和调用动态链接库(DLL)可以提供一种模块化的方式来组织和重用代码。
本文将介绍如何使用VC++创建DLL,并在另一个VC++项目中调用该DLL。
创建DLL以下是使用VC++创建DLL的步骤:1.打开VC++,在“文件”菜单中选择“新建”->“项目”。
2. 在“新建项目”对话框中,选择“Win32控制台应用程序”。
点击“下一步”。
3.输入项目名称,并选择项目位置,点击“下一步”。
4.在“应用程序类型”对话框中,选择“DLL”并取消勾选“预编译头”。
点击“下一步”。
5.在“进入代码”对话框中,选择“空项目”。
点击“完成”。
6. 创建一个新的源文件,例如“MyDLL.cpp”。
7. 在“MyDLL.cpp”中,编写所需的函数并导出。
例如:```C++#include <Windows.h>// 导出的函数需要使用__declspec(dllexport)修饰extern "C" __declspec(dllexport) int AddNumbers(int a, int b) return a + b;```8. 在项目属性中,选择“链接器”->“高级”,将“入口点”设置为“DllMain”。
9.在“生成”菜单中选择“生成解决方案”,以生成DLL文件。
以下是在VC++项目中调用DLL的步骤:1.打开VC++,在“文件”菜单中选择“新建”->“项目”。
2. 在“新建项目”对话框中,选择“Win32控制台应用程序”。
点击“下一步”。
3.输入项目名称,并选择项目位置,点击“下一步”。
4.在“应用程序类型”对话框中,选择“控制台应用程序”并取消勾选“预编译头”。
点击“下一步”。
5.在“附加选项”对话框中,勾选“空项目”。
点击“完成”。
6.将之前生成的DLL文件复制到新项目的文件夹中。
7.在项目属性中,选择“C/C++”->“常规”,将“附加包含目录”设置为包含DLL文件的文件夹路径。
Win32创建后台进程
Win32创建后台进程创建后台进程之前先判断进程时候有在运⾏,如果有,则直接返回,否则创建。
创建后台进程,放进单独线程⾥⾯做⽐较好,然后在其他线程可以同时做⼀些初始化或者其他的⼯作,当然这些⼯作必须和后台没有联系,和后台有联系的必须放在后台创建完成之后。
本例⼦以创建adb后台server为例做的。
废话不多少,代码如下:1 #include <Tlhelp32.h>23#define DEAMON_FILE _T("adb.exe")4 BOOL IsProcessIsRun(LPCTSTR lpProcessName);56 BOOL IsProcessIsRun(LPCTSTR lpProcessName) //判断指定的Exe程序是否正在运⾏,当前进程除外7 {8 DWORD ID;9 DWORD ProcessID=GetCurrentProcessId(); //记录当前程序的ID1011 PROCESSENTRY32 pe; //记录各个进程的数据12 memset(&pe,0x00,sizeof(PROCESSENTRY32));13 pe.dwSize=sizeof(PROCESSENTRY32);14 HANDLE hSnapshot=NULL;15 hSnapshot=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //记录系统进程列表快照16 BOOL result = FALSE;17 result = Process32First(hSnapshot,&pe); //开始列举所有的进程1819while(result)20 {21 ID=pe.th32ProcessID;22if(ID==ProcessID)23 {24 result=Process32Next(hSnapshot,&pe);25continue;26 }27if(_tcsicmp(pe.szExeFile, lpProcessName) == 0)28 {29return TRUE;30 }31 result=Process32Next(hSnapshot,&pe);32 }33 CloseHandle(hSnapshot);3435return FALSE;36 }3738 BOOL ExecuteAdbDeamon(void)39 {40if(IsProcessIsRun(DEAMON_FILE))41return TRUE;4243 TCHAR szPath[MAX_PATH] = {0}; //保存程序运⾏的绝对路径44 CString strExe; //守护进程的完整路径名45if (GetCurrentDirectory(MAX_PATH - 1, szPath))46 {47 CString strPath = szPath;48if(strPath.GetAt(strPath.GetLength() - 1) != _T('\\'))49 strPath += _T("\\");50 strExe = strPath + DEAMON_FILE;51 }5253 SHELLEXECUTEINFO se;54 ZeroMemory(&se, sizeof(SHELLEXECUTEINFO));55 se.cbSize = sizeof(SHELLEXECUTEINFO);56 se.fMask = SEE_MASK_NOCLOSEPROCESS;57 se.lpVerb = _T("open");58 se.lpFile = strExe;59 se.lpParameters = _T("start-server");6061 BOOL bRet = ShellExecuteEx(&se); //命令执⾏必须在守护进程执⾏完之后62if (bRet && se.hProcess)63 {64 WaitForSingleObject(se.hProcess, INFINITE);65 CloseHandle(se.hProcess);66 }67else68 {69 exit(1);70 }71 }。
vc6.0写xml案例
vc6.0写xml案例在VC6.0中编写XML的案例,可以通过使用MSXML库来实现。
下面我将从多个角度来介绍如何在VC6.0中编写一个简单的XML案例。
1. 包含头文件和初始化。
首先,在VC6.0中创建一个新的Win32控制台应用程序项目。
然后在代码中包含MSXML库的头文件,可以使用以下代码:c.#include <msxml2.h>。
接着,需要初始化COM组件,可以使用以下代码:c.CoInitialize(NULL);2. 创建XML文档。
接下来,我们可以创建一个XML文档对象并添加元素和属性。
以下是一个简单的示例代码:c.IXMLDOMDocument pXMLDom = NULL;HRESULT hr = CoCreateInstance(__uuidof(DOMDocument), NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument,(void)&pXMLDom);if (SUCCEEDED(hr))。
{。
IXMLDOMElement pRoot = NULL;pXMLDom->createElement(L"Root", &pRoot);pXMLDom->appendChild(pRoot, NULL);IXMLDOMElement pChild = NULL;pXMLDom->createElement(L"Child", &pChild);pRoot->appendChild(pChild, NULL);pChild->setAttribute(L"Attribute",_variant_t(L"Value"));}。
3. 保存和释放资源。
在完成XML文档的创建后,我们需要保存XML文档并释放资源。
win32gui用法
win32gui用法Win32 GUI编程是Windows平台下一种重要的开发方式,通过使用Win32 GUI库,我们可以创建具有图形用户界面(GUI)的应用程序。
其中,win32gui是Python中一个常用的GUI库,它提供了丰富的API,方便我们进行GUI开发。
一、win32gui库介绍win32gui库是Python中用于Windows平台下进行GUI开发的库,它提供了丰富的API,包括窗口、控件、消息、图标、位图等操作接口。
通过使用win32gui库,我们可以方便地进行窗口创建、消息处理、控件操作等GUI开发工作。
二、win32gui基本用法1. 导入win32gui库在使用win32gui库之前,需要先导入它。
在Python中,可以使用`import win32gui`语句来导入该库。
2. 创建窗口使用win32gui库创建窗口需要使用`win32gui.CreateWindow()`函数。
该函数需要传入窗口的类名、窗口的样式、窗口的父窗口等参数。
创建窗口后,可以通过调用其他函数来设置窗口的位置、大小、标题等信息。
示例代码:```pythonimport win32guiwindow_class = "MyWindowClass"window_style = win32con.WS_OVERLAPPEDWINDOW |win32con.WS_VISIBLEwindow_rect = (0, 0, 640, 480)window_proc = win32gui.WNDPROC()win32gui.RegisterClass(window_class)window = win32gui.CreateWindow(window_class, "My Window Title", window_style, window_rect, None, None, None, None, None)```3. 发送消息使用win32gui库可以发送各种消息到窗口中,例如WM_PAINT消息用于绘制窗口内容,WM_CLOSE消息用于关闭窗口等。
win32界面编程 实例
win32界面编程实例
Win32界面编程是指使用Win32 API来创建Windows应用程序
的用户界面。
下面我将从不同角度给出一些Win32界面编程的实例。
1. 创建窗口,使用Win32 API可以创建一个基本的窗口应用程序。
首先需要注册窗口类,然后创建窗口并处理窗口消息。
通过设
置窗口类的属性和消息处理函数,可以实现窗口的基本功能,比如
响应用户输入、绘制图形等。
2. 控件和布局,Win32 API提供了一系列控件,比如按钮、文
本框、列表框等,可以通过创建这些控件来构建丰富的用户界面。
同时,可以使用布局管理技术来控制控件的位置和大小,以实现界
面的美观和合理布局。
3. 图形绘制,Win32 API允许开发者直接操作图形设备接口(GDI),从而实现自定义的图形绘制功能。
通过GDI可以绘制各种
图形、文本和图像,实现丰富多彩的界面效果。
4. 用户交互,Win32界面编程可以实现丰富的用户交互功能,
比如鼠标点击、键盘输入、菜单操作等。
通过响应用户的交互行为,
可以让应用程序更加灵活和易用。
5. 窗口管理,Win32 API提供了丰富的窗口管理功能,比如最大化、最小化、关闭窗口等。
开发者可以通过这些功能来管理应用程序的窗口,提升用户体验。
总之,Win32界面编程可以实现丰富多彩的Windows应用程序界面。
开发者可以通过灵活运用Win32 API提供的功能,创建出符合自己需求的界面效果。
希望以上实例可以帮助你更好地理解
Win32界面编程。
win32DLL创建及C#调用过程
win32 DLL1.建立win32 Dll 工程。
添加创建的Dll文件,包括: .h ,.cpp和.def三个文件。
示例如下:TestDll.h文件#ifndef TestDll_H_#define TestDll_H_#ifdef MYLIBDLL#define MYLIBDLL extern"C"_declspec(dllimport)#else#define MYLIBDLL extern"C"_declspec(dllexport)#endifMYLIBDLL int Add(int plus1, int plus2);//You can also write like this://extern "C" {//_declspec(dllexport) int Add(int plus1, int plus2);//};#endifTestDll.cpp文件#include"stdafx.h"#include"testdll.h"#include<iostream>using namespace std;int Add(int plus1, int plus2){int add_result = plus1 + plus2;return add_result;}TestDll.def 接口定义文件LIBRARY "MyDLL"EXPORTSAdd @12、c#调用C++ win32创建的DLLusing System.Runtime.InteropServices; //运行时Dll支持的库文件[DllImport("MyDll.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl,EntryPoint = "Add")]//字符集要自动适应,在c++WIN32程序中有三种calling convention(呼叫约定):__cdecl, __stdcall, __fastcall默认为__cdecl,、//而c#中默认为CallingConvention =CallingConvention.Winapi,两个平台呼叫约定不一致,所以会出现提示的不匹配错误。
9《白手起家Win32SDK应用程序》第9篇 窗口标题栏上显示自定义图标(手动编辑代码)
第9篇窗口标题栏上显示自定义图标(手动编辑代码)白云小飞本篇想通过手动直接编辑代码的方式(而不是可视化的方式)来操作使用自定义的图标。
(以在窗口标题栏上显示自定义图标为例)通过本篇,你将知道如何使用图标资源及实质,并有助于你理解在可视化方式编辑使用图标资源过程中的代码实质。
另外,可以触类旁通,明白VC中的Window应用程序对各种类似资源(如光标资源、位图资源、声音资源等)操作的一般机制。
一开始我们的思考:程序所要用到的各类图像、声音等资源应放在什么地方为好?一个程序可能需要使用各种图像、声音。
那么,你认为应把这些东西放在什么地方呢?一种很显然的做法:就是让这些图形、图像、声音仍以文件形式(如.bmp .jpg .ico .cur .wav等等扩展名的文件,)保存在磁盘中,不包含在应用程序(.exe)中。
当我的.exe程序执行时需要这些文件时再把它们从磁盘中加载到内存里并对它们操作。
如果你是想写一个看图软件或播放音乐之类的软件,这当然是一种最佳的做法啦。
但是,有时候你的程序可能要显示一个代表你程序的图像等等的情况。
由于前述的方法中,图形、图像、声音是以独立的文件形式,所以软件的使用者是很容易就改动及删除它们的,唉!我可不希望这样啊!那么,还有什么办法呢?还有一种可以想到的做法:就是让这些图形、图像、声音等数据在编译时就把它们编译进.exe文件中。
显然,由于程序要用到的各种图像、声音等的数据已经包含在.exe里面了,这样,软件使用者只要拥有这个.exe文件就可以。
同时使用者要想改动程序所用的这些图形、图像、声音也就不是那么容易。
啊!exe程序文件里居然也能存储各种类型图像、声音!嗯,这可是Windows的一个设计目标:可执行程序里不仅只含有程序代码,还可以存储各种图像、声音等的数据呢!也可能第一次让你有了这个念头!但不管怎么说,程序是可以这样设计的!好了,那么又如何创建一个包含有图标资源并使用这个图标的.exe文件呢?二图像、声音资源操作的一般步骤。
Visual_Studio_2012_C++使用教程
Visual C++ 指导教程Visual Studio 2012在本指导教程中,将介绍Visual Studio 开发环境,以及可以使用Visual C++ 创建的各种类型的应用程序。
其中包括命令行应用程序、Windows 应用程序,甚至简单的游戏。
本指导教程还将介绍如何创建可重用代码库,以及如何在编写和测试了代码后将其交付给客户。
因为每个主题都以上一主题中的信息为基础,所以我们建议您按顺序完成指导教程。
在每个主题的底部,您可以找到指导教程下一主题的导航链接和上一主题的链接(如果需要返回并查看某些内容)。
本指导教程假定您具备C++ 语言的基础知识。
本节内容Visual Studio IDE 简介(C++)描述如何使用Visual Studio IDE 创建解决方案和项目,以便有效地编写代码并生成、调试、测试和部署应用程序。
创建命令行应用程序(C++)介绍 C 和C++ 命令行应用程序,讨论如何创建符合ANSI 的 C 或C++ 程序,并描述如何使用命令行编译器编译应用程序。
创建Windows 应用程序(C++)描述如何创建Windows API (Win32) 应用程序、Windows 窗体应用程序、Windows 窗体控件,甚至简单的DirectX 游戏。
创建可重用代码(C++)描述如何创建动态链接库(DLL)、静态库和托管程序集,以便多个应用程序可以方便地重用代码。
下一步要做什么(C++)包含指向文档其他部分的链接,您可以学习关于指导教程中介绍的主题的更多信息。
Visual Studio IDE 简介(C++)Visual Studio 集成开发环境(IDE) 提供了一组工具,可帮助您编写和修改代码,以及检测和更正错误。
在这些主题中,您将创建一个新的标准C++ 程序,并使用Visual Studio 为C++ 开发人员提供的功能测试该程序的功能。
您创建的简单程序将跟踪有多少个玩家正在玩各种纸牌游戏。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
创建Win32 应用程序(C++)Win32 API(也称为Windows API)是用于创建Windows 应用程序的基于C 的框架,自Windows 1.0 以来就已存在。
在Windows API中可以找到有关此API 的大量文档。
在本过程中,我们将创建向窗口显示“Hello, World!”的简单Win32应用程序。
过程中的步骤对于所有Win32 应用程序都是相同的。
完成此过程后,您可以将这里创建的代码用作创建任何其他Win32 应用程序的主干。
创建新的Win32 项目1.在“文件”菜单上,单击“新建”,然后单击“项目...”。
2.在“项目类型”窗格中,选择“Visual C++”节点中的“Win32”,然后在“模板”窗格中选择“Win32 项目”。
键入项目的名称,如win32app。
您可以接受默认位置、键入一个位置或者导航到要保存项目的目录。
3.在“Win32 应用程序向导”中,选择“下一步”。
4.在“Win32 应用程序向导”中,在“应用程序类型”下选择“Windows 应用程序”。
在“附加选项”下选择“空项目”。
原样保留剩余的选项。
单击“完成”创建项目。
5.在“项目”菜单中选择“添加新项...”,将C++ 文件添加到项目中。
在“添加新项”对话框中选择“C++ 文件(.cpp)”。
为文件键入一个名称,如GT_HelloWorldWin32.cpp,并单击“添加”。
启动Win32 应用程序1.正如您所了解的,每个C 和C++ 应用程序必须具有一个main函数。
此函数是应用程序的起始点。
类似地,在Win32 应用程序中,每个应用程序必须具有一个WinMain函数。
WinMain的语法如下所示:int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow);2.因为应用程序代码必须使用现有的定义,所以应将include 语句添加到文件中以使用它们。
例如:#include <windows.h>#include <stdlib.h>#include <string.h>#include <tchar.h>3.除WinMain外,每个Win32 应用程序还必须具有第二个函数(通常称为WndProc),它代表窗口过程。
WndProc的语法如下所示:LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);此函数的用途是处理应用程序从操作系统接收的任何消息。
应用程序何时从操作系统接收消息?始终接收!例如,假设我们创建了包含“确定”按钮的对话框。
当用户单击该按钮时,操作系统向应用程序发送消息,使我们知道某位用户按下了此按钮。
WndProc函数负责响应该事件。
在本示例中,适当的响应可能是关闭对话框。
有关更多信息,请参见窗口过程。
向WinMain 添加功能1.首先,在WinMain函数内部创建WNDCLASSEX类型的窗口类结构。
此结构包含有关窗口的信息,如应用程序图标、窗口的背景色、在标题栏中显示的名称、窗口过程函数的名称等等。
典型的WNDCLASSEX结构如下:WNDCLASSEX 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_A PPLICATION));wcex.hCursor = LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName = NULL;wcex.lpszClassName = szWindowClass;wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE (IDI_APPLICATION));有关此结构的字段解释,请参见WNDCLASSEX。
2.现在已经创建了窗口类,接下来您必须注册它。
使用RegisterClassEx函数,并将窗口类结构作为参数传递:if (!RegisterClassEx(&wcex)){MessageBox(NULL,_T("Call to RegisterClassEx failed!"),_T("Win32 Guided Tour"),NULL);return 1;}3.现在已经注册了您自己的类,接下来创建窗口。
使用CreateWindow函数,如下所示:static TCHAR szWindowClass[] = _T("win32app");static TCHAR szTitle[] = _T("Win32 Guided Tour Application");// The parameters to CreateWindow explained:// szWindowClass: the name of the application// szTitle: the text that appears in the title bar// WS_OVERLAPPEDWINDOW: the type of window to create// CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)// 500, 100: initial size (width, length)// NULL: the parent of this window// NULL: this application dows not have a menu bar// hInstance: the first parameter from WinMain// NULL: not used in this applicationHWND hWnd = CreateWindow(szWindowClass,szTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,500, 100,NULL,NULL,hInstance,NULL);if (!hWnd){MessageBox(NULL,_T("Call to CreateWindow failed!"),_T("Win32 Guided Tour"),NULL);return 1;}此函数返回HWND,它是某个窗口的句柄。
有关更多信息,请参见Windows 数据类型。
4.创建了窗口后,我们可以使用以下代码将其显示在屏幕上:// The parameters to ShowWindow explained:// hWnd: the value returned from CreateWindow// nCmdShow: the fourth parameter from WinMainShowWindow(hWnd,nCmdShow);UpdateWindow(hWnd);到目前为止,此窗口还不会显示,因为我们尚未实现WndProc函数。
5.WinMain的最后一步是消息循环。
此循环的用途是侦听操作系统发送的消息。
应用程序收到消息后,将该消息调度到WndProc函数,以便进行处理。
消息循环类似于:MSG msg;while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return (int) msg.wParam;有关消息循环中使用的结构和函数的更多信息,请参见MSG、GetMessage、TranslateMessage 和DispatchMessage。
您刚才完成的步骤为大多数Win32 应用程序所共用。
有关此应用程序所需要的include 指令和全局变量声明,请参见本主题末尾的完整代码示例。
此时,WinMain函数应该与下面的内容类似:int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){WNDCLASSEX 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_A PPLICATION));wcex.hCursor = LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName = NULL;wcex.lpszClassName = szWindowClass;wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE (IDI_APPLICATION));if (!RegisterClassEx(&wcex)){MessageBox(NULL,_T("Call to RegisterClassEx failed!"),_T("Win32 Guided Tour"),NULL);return 1;}hInst = hInstance; // Store instance handle in our global vari able// The parameters to CreateWindow explained:// szWindowClass: the name of the application// szTitle: the text that appears in the title bar// WS_OVERLAPPEDWINDOW: the type of window to create// CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)// 500, 100: initial size (width, length)// NULL: the parent of this window// NULL: this application dows not have a menu bar// hInstance: the first parameter from WinMain// NULL: not used in this applicationHWND hWnd = CreateWindow(szWindowClass,szTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,500, 100,NULL,NULL,hInstance,NULL);if (!hWnd){MessageBox(NULL,_T("Call to CreateWindow failed!"),_T("Win32 Guided Tour"),NULL);return 1;}// The parameters to ShowWindow explained:// hWnd: the value returned from CreateWindow// nCmdShow: the fourth parameter from WinMainShowWindow(hWnd,nCmdShow);UpdateWindow(hWnd);// Main message loop:MSG msg;while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return (int) msg.wParam;}向WndProc 添加功能1.WndProc函数的用途是处理应用程序接收的消息。