网络编程WINDOWSAPI
C++WINDOWSAPI第2章WindowsAPI概要
C++WINDOWSAPI第2章WindowsAPI概要
⽬录
2.1 Windows数据类型.. 1
2.1.1 Windows数据类型⽰例.. 1
2.1.2 Windows 数据类型与标准C 数据类型的关系.. 5
2.1.3 Windows 数据类型与Windows API 5
2.1.4 Windows 中的数据结构.. 6
2.2 Windows API 的功能分类.. 7
2.2.1 系统基本服务.. 7
2.2.2 系统管理.. 9
2.2.3 ⽤户界⾯.. 9
2.2.4 图像和多媒体.. 15
2.2.5 ⽹络.. 15
2.2.6 其他功能.. 15
2.3 Windows API核⼼DLL. 16
2.3.1 Kerne132.dll 16
2.3.2 User32.dll 16
2.3.3 Gdi32.dll 16
2.3.4 标准C函数.. 17
2.3.5 其他Dll 17
2.4 Unicode和多字节.. 17
2.4.1 W版本和A版本的API 21
2.4.2 Unicode与ASGII的转换.. 22
2.4.3 对Windows程序设计规范的建议.. 22
2.5 ⼩结.. 23
2.1 Windows数据类型
Windows API 使⽤了很多 Windows ⾃⼰定义的数据类型。读者可能较为熟悉 C 语⾔或 C++语⾔的数据类型。要熟练使⽤ Windows API 必须要熟悉 Windows 数据类型。这些数据类型是Windows 特有的。在 SDK 的相关头⽂件中有定义。
在众多的Windows 数据类型中,最常⽤的有 DWORD、HANDLE、LPTSTR、WORD、BYTE、CHAR 等。在 Windows 系统
VB编程:WindwosAPI全攻略
⼀、什么是Windows API?
Windows 这个多作业系统除了协调应⽤程式的执⾏、分配内存、管理系统资源…之外,她同时也是⼀个很⼤的服务中⼼,调⽤这个服务中⼼的各种服务(每⼀种服务就是⼀个函数),可以帮应⽤程式达到开启视窗、描绘图形、使⽤周边设备…等⽬的,由於这些函数服务的对象是应⽤程式(Application),所以便称之为 Application Programming Interface,简称 API 函数。WIN32 API也就是MicrosoftWindows 32位平台的应⽤程序编程接⼝。
⼆、VB中调⽤Windows API的注意事项
Visual Basic (VB)作为⼀种⾼效编程环境,它封装了部分Windows API函数,但也牺牲了⼀些API的功能。调⽤API时稍有不慎就可能导致API编程错误,出现难于捕获或间歇性错误,甚⾄出现程序崩溃。要减少API编程错误,提⾼VB调⽤API 时的安全性,应重点注意很多问题。
三、Windows API函数的分类
控件窗体类
* 使窗体右上⾓的X按钮失效* 调⽤API函数设计ABOUT窗⼝* 让窗体处于最前⾯* 拖动没有标题栏的窗体* 半透明窗体(win2000特有API)
* ⾃制IE风格按纽控件* 制作垂直标题栏的窗体
硬件与系统类
* ⽤API函数控制光驱开关* 取回当前计算机名* 妙⽤GetSystemMetrics函数* 计算Windows运⾏总时间* ⽤API函数和注册表获取系统信息* ⽤VB获得⼤容量硬盘信息* 取得磁盘序列号、卷标和⽂件系统类型
python 远程调用windowsapi的方法
python 远程调用windowsapi的方法
远程调用Windows API的方法可以通过使用Python的`ctypes`标准库来实现。`ctypes`允许我们在Python中调用动态链接库(DLL)中的函数,并通过使用Windows API来执行各种任务,如文件操作、系统管理和网络通信等。
要远程调用Windows API的方法,首先需要确定要调用的API函数所在的DLL。然后,我们可以使用`ctypes`来加载该DLL并获取函数的引用。接下来,可以使用获取的函数引用来调用相应的API函数,并传递所需的参数。
以下是一个简单的示例,演示如何远程调用Windows API函数
`GetWindowText`来获取指定窗口句柄的标题:
```python
import ctypes
user32 = er32 # 加载user32.dll
# 定义GetWindowText函数的参数类型
user32.GetWindowTextW.argtypes = [ctypes.c_void_p, ctypes.c_wchar_p, ctypes.c_int]
# 定义GetWindowText函数的返回类型
user32.GetWindowTextW.restype = ctypes.c_int
# 调用GetWindowText函数获取窗口标题
hwnd = 12345 # 替换为要获取标题的窗口句柄
buffer_size = 256
buffer = ctypes.create_unicode_buffer(buffer_size)
Win系统API大全
Windows API函数大全
1. API之网络函数
WNetAddConnection 创建同一个网络资源的永久性连接WNetAddConnection2 创建同一个网络资源的连接WNetAddConnection3 创建同一个网络资源的连接WNetCancelConnection 结束一个网络连接
WNetCancelConnection2 结束一个网络连接
WNetCloseEnum 结束一次枚举操作
WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接
WNetDisconnectDialog 启动一个标准对话框,以便断开同网络资源的连接
WNetEnumResource 枚举网络资源
WNetGetConnection 获取本地或已连接的一个资源的网络名称WNetGetLastError 获取网络错误的扩展错误信息WNetGetUniversalName 获取网络中一个文件的远程名称以及/或者UNC(统一命名规范)名称
WNetGetUser 获取一个网络资源用以连接的名字
WNetOpenEnum 启动对网络资源进行枚举的过程
2. API之消息函数
BroadcastSystemMessage 将一条系统消息广播给系统中所有的顶级窗口
GetMessagePos 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置
GetMessageTime 取得消息队列中上一条消息处理完毕时的时间PostMessage 将一条消息投递到指定窗口的消息队列PostThreadMessage 将一条消息投递给应用程序RegisterWindowMessage 获取分配给一个字串标识符的消息编号ReplyMessage 答复一个消息
windows编程实验二:简单的Windows_API程序设计
实验二:简单的 Windows API 程序设计
一、实验目的
本实验主要编写一个简单的Windows API 程序。通过本实验你将能:
●了解Windows API 程序的VC++ 开发环境
●学习开发简单的Windows API 程序
●理解Windows 程序中的消息循环
二、背景知识
Windows 编程,有人觉得要先学通用性较好的Win32 API 编程,也有人觉得应先学包装性较好的在VC++ 平台上较容易使用的Win32 MFC 编程。本课程只学一个简单的Windows API 程序作为过渡,与前面的控制台菜单程序进行比较,对消息循环有较充分的理解后,然后再学习MFC 编程。
三、实验准备
●阅读课件和教科书。
●准备一个简单的Windows API 程序。
四、实验要求与步骤
使用VC++ 运行和理解简单的Windows API 程序, 仔细分析该程序的结构和执行的流程:
1.进入 VC++ 开发环境
2.新建一个“Win32应用程序”空项目
3.在项目中加入下载的“C/C++源程序”文件api.cpp
4.编辑调试运行程序。
5.试试改变窗口类的风格(值是CS_*)和窗口实例的风格(值是WS_*)(可参考
windows.h 或在线查询)
6.改变窗口实例的宽为 200,高为 100,标题 Title/Caption 为“Windows
App”。
7.改变窗口体内的输出为“Windows API 应用程序”
8.查看窗口类的类名是什么?
9.尝试查询API函数MessageBox的作用及参数要求。
10.试注释掉 ShowWindow(...); 和 UpdateWindow(...); 说明程序运行情况?
用C#调用WindowsAPI向指定窗口发送按键消息
⽤C#调⽤WindowsAPI向指定窗⼝发送按键消息
⼀、调⽤Windows API。
C#下调⽤Windows API⽅法如下:
1、引⼊命名空间:using System.Runtime.InteropServices;
2、引⽤需要使⽤的⽅法,格式:[DllImport("DLL⽂件")]⽅法的声明;
[DllImport("user32.dll")]private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
[DllImport("user32.dll")]private static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]private static extern IntPtr FindWindow(string lpClassName,string lpWindowName);
[DllImport("user32.dll")]private static extern int SendMessage(IntPtr hWnd,int Msg,int wParam,int lParam);
[DllImport("user32.dll")]private static extern bool SetCursorPos(int X, int Y);
[DllImport("user32.dll")]private static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);
WindowsAPI编程
(这就是可视化编程的思想):而在解决了程序的用户界面后, 程序员可以花更多的时间去进行应用程序的功能设计。Windows 图形用户界面的基本元素也是其具有的另一个优点。程序员可以
很容易地设计出代表诸如文件和目录物理结构的图形表示,并能 提供这些元素所具有的特性。
第一章 Windows程序 设计概述(三)
{
switch(MessageType)
Fra Baidu bibliotek
{// 使用SWITCH语句将各种消息分开
case(WM_PAINT):
doYourWindow (…); // 在窗口需要重新绘制时进行输出
break ;
case (WM_LBUTTONDOWN):
doYourWork(…)// 在鼠标左键被按下时进行处理
吉林大学远程教育课件
Windows A P I编 程
(第一讲)
主讲人 : 翟慧杰
学 时:48
前言
Windows操作系统是当今世界上最为流 行的操作系统之一,几乎每个台式机用户都 使用过Windows,用过Windows平台下的应 用软件。计算机业界对基于Windows应用软 件的巨大需求刺激了Windows本身不断更新, 同时也刺激了开发Windows应用软件的程序 员队伍不断壮大。
WindowsAPI教程(一)WindowAPI概要
WindowsAPI 教程(一)WindowAPI 概要
Windows API 教程(一) Window API 概要
Posted on 2013 年 4 月 23 日 by lellansin
hello Windows 编程
以下代码可以在 vc6.0 以及vs 系列的IDE 上运行
1 2 3 4 5 6 #include <windows.h> int main() { MessageBox(NULL, (LPCSTR)"hello, windows programming",
(LPCSTR)"Title", MB_OK); return 0; } 如果提示找不到 windows.h 那么很有可能是你装的不是完整版的vc6.0 亦或者,你用的不是微软的工具(上面列举的都是微软的)
那么,不解释,你懂的。windows 这个操作系统本身就是微软公司的,所以如果你想在windows 上面做开发的话,首先推荐的是微软自己的 visual studio 系列IDE 。如果你是想学习的话推荐使用 visual studio 2012(据说要win7 64位才能装),如果希望你的程序能在一般的电脑上能跑的话,那么避免麻烦还是推荐使用 visual studio 2010 了。(原因本站也有相关博文,有兴趣的可以找找)
Windows 数据类型
想要学习windwos 编程,第一步就需要了解 windows 编程所常用的数据类型。 Windows API 中定义了很多 Windows 自己定义的数据类型。对于函数的入口参数、返回值以及一些数据结构等等都使用的是 windows 数据类型,所以这也是一个必不可少的步骤。
WindowsAPI编程入门
WindowsAPI编程⼊门
Windows ⼯作原理的中⼼思想就是“动态链接”概念。Windows ⾃⾝带有⼀⼤套函数,应⽤程序就是通过调⽤这些函数
来实现它的⽤户界⾯和在屏幕上显⽰⽂本和图形的。这些函数都是在动态链接库⾥实现的。
这些⽂件的名称都带有后缀 .dll,或有时带有 .exe。
Windows 的 3 个主要⼦系统:内核(kernel),⽤户(user),GDI。
内核负责操作系统的传统⼯作:如内存管理,⽂件输⼊/输出以及任务管理等。
⽤户指的是⽤户界⾯,负责所有的窗⼝管理。
GDI 就是图形设备接⼝,负责在屏幕或打印机上显⽰⽂本与图形。
在 Windows 程序中,调⽤ Windows 函数与调⽤ C 语⾔的库函数没有什么两样。
最主要的区别就是 C 语⾔库函数的机器代码会直接链接到你的程序代码中去,⽽ Windows 函数则是放到你的程序之外的 DLL ⾥。
Windows 程序运⾏时,它通过⼀个叫“动态链接”的进程与 Windows 接⼝。
每个 Windows 的 EXE ⽂件包含它所要⽤到的各个动态链接库以及库中的函数的引⽤地址。
当⼀个 Windows 程序被装⼊内存后,程序中的函数调⽤都被解析 DLL 函数⼊⼝的指针,同时这些被调⽤的函数也被装⼊内存。
当链接 Windows 程序以⽣存可执⾏⽂件时,⼀定得链接你的编程环境所提供的特殊的“导⼊库”。
这些导⼊库包含所有 Windows 函数调⽤要碰到的动态链接库的名字及引⽤信息。链接程序利⽤这些信息构建 EXE ⽂件中的表格,当装⼊程序的时候,Windows 要靠这些表格来解析 Windows 函数调⽤。
Windows应用程序编程接口API(第5章)94804
Windows操作系统核心有三个动态链接库(Kernel32.dll, User32.dll,Gdi32.dll),这些动态链接库构成了Win32 API函数。
1. Windows内核库(Kernel32.dll) 内核库中的函数用于处理操作系统功能的所有核心工作,例如多任务管理、
内存管理等。另外内核库还管理系统注册表。 2. Windows用户界面管理库(User32.dll)
第5章 目 录
Visual C++
本章以一些API设计的控制台程序和具有图形界面的Win32程序 为例,阐述了利用API函数开发程序的过程,重点在于理解操作系统 所提供的各种服务以及程序员如何进行调用。
1. 2. 3. 4. 5. 习题
API概述 内核服务API函数的使用 网络接口服务 Win32 API编写图形界面程序 图形设备接口与用户接口服务
1.内核服务 通过内核服务函数,应用程序可以使用计算机中的资源和操作系统
的特性,例如内存,文件系统、设备、进程、线程等。拿一个简单的文 件输入输出函数来说,通过这些函数,程序员可以存取本地计算机或网 络 中某台计算机中的文件、目录、输入输出设备,并且这些文件函数支 持各 种各样的文件Fra Baidu bibliotek统,包括FAT、NTFS的文件系统。
Windows三个核心库中的API函数的原型声名在windows.h中有说明,这就是我们在 编写Win32应用程序时要在程序开头放#include “windows.h”语句的原因。
windows api命名规格
windows api命名规格
Windows API命名规范是微软公司为了提高代码可读性和维护性而制定的一系列规则,用于指导开发者在使用Windows API时的命名风格和约定。本文将逐步回答关于Windows API命名规范的问题,并解释其重要性和实际应用。
问题1:什么是Windows API?
Windows API(Application Programming Interface)是一套由操作系统提供的函数和过程,用于允许应用程序与底层操作系统交互。Windows API为开发者提供了访问和控制Windows操作系统的能力,包括窗口管理、文件访问、网络通信等功能。
问题2:为什么需要命名规范?
命名规范在软件开发中非常重要,它有助于提高代码的可读性和可维护性。当多个开发者同时参与一个项目时,遵循统一的命名规范可以使代码更具一致性,降低理解和修改代码的难度。此外,命名规范还有助于提高代码的可重用性和扩展性,减少错误和冲突的可能性。
问题3:有哪些常见的命名规范?
Windows API命名规范主要包括以下几个方面:
1. 前缀:Windows API函数通常以一个或多个字母作为前缀来表示它们所属的模块或子系统。例如,以“Get”开头的函数通常用于获取某些信息,以“Create”开头的函数通常用于创建对象或资源。
2. 名称规则:函数名称应使用驼峰命名法,即单词首字母大写,并且去掉下划线分隔符。例如,"CreateWindow"代表创建一个窗口,"SendMessage"代表发送消息。
3. 参数名称:参数名称应具有描述性,并且避免使用缩写或简写。参数名称应该清晰地表示参数的含义和用途。
windows权限设置 api函数例子
windows权限设置 api函数例子
以下是一个使用Windows API函数来设置文件或文件夹权限的例子:
```c++
#include <Windows.h>
#include <aclapi.h>
// 设置文件或文件夹的权限
BOOL SetFileOrFolderPermissions(LPCTSTR lpFilePath, DWORD dwPermissions)
{
// 获取文件或文件夹的安全描述符
PSECURITY_DESCRIPTOR pSD = NULL;
if (GetNamedSecurityInfo(lpFilePath, SE_FILE_OBJECT, dwPermissions, NULL, NULL, NULL, NULL, &pSD) != ERROR_SUCCESS) {
return FALSE;
}
// 创建一个新的访问控制列表(ACL)
PACL pACL = NULL;
if (InitializeAcl(&pACL, sizeof(ACL), ACL_REVISION) == FALSE)
{
LocalFree(pSD);
return FALSE;
}
// 向ACL中添加一个访问控制项(ACE)
if (AddAccessAllowedAce(pACL, ACL_REVISION, dwPermissions, pSid) == FALSE)
{
LocalFree(pSD);
return FALSE;
}
// 将新的ACL设置为安全描述符的访问控制列表(DACL)
windows api 用法
windows api 用法
Windows API是指Windows操作系统开发的接口,用于控制系统内的各种应用。以下是Windows API的用法示例:
```vb
Private Declare Sub Sleep Lib "kernel32" (ByVal dw Milliseconds As Long) ```
上述代码中的关键字和参数含义如下:
- Private:声明在窗体的通用部分,表示这个窗体的任何地方都可以调用。
- Declare:表示要声明API。
- Sub:是一个过程,没有返回值。
- Sleep:是API的名称,相当于过程的名字,从字面上来看是“睡眠”的意思,在这里是让系统延时。
- dw Milliseconds:参数为毫秒,即暂停运行的时间,1秒=1000毫秒。
通过调用Windows API,开发人员可以在编程中实现更强大的功能和更复杂的操作,如果你想了解更多关于Windows API的用法,可以继续向我提问。
WinAPI在C语言中的应用
WinAPI在C语言中的应用
WinAPI(Windows Application Programming Interface)是一组用于
开发Windows应用程序的函数、类和结构体的集合。它提供了一个与
操作系统交互的编程接口,使得开发者能够利用操作系统提供的功能
和资源来创建各种类型的应用程序。本文将介绍WinAPI在C语言中
的应用,并探讨它在不同领域中的重要性。
一、WinAPI的概述
WinAPI是使用C语言编写的,为Windows操作系统提供了许多功
能和特性。它提供了一套函数接口,通过这些函数可以实现与操作系
统及其组件进行交互。通过使用WinAPI,开发者可以操纵窗口、界面、文件、网络等,为用户提供更好的应用程序体验。在C语言中使用WinAPI,开发者需要包含相应的头文件,并正确调用相关函数以实现
所需的功能。
二、WinAPI的应用领域
1. 窗口和界面设计:WinAPI提供了丰富的函数和结构体,使得开
发者能够创建各种类型的窗口应用程序,包括桌面应用程序、图形用
户界面(GUI)、游戏等。通过使用WinAPI,可以实现窗口的创建、
显示、隐藏、拖动、调整大小等操作,为用户提供友好的界面和交互
体验。
2. 文件操作:WinAPI提供了一系列函数来处理文件和目录。通过
使用这些函数,可以实现文件的读取、写入、复制、移动、删除等操
作。此外,还可以获取文件属性、创建文件夹、遍历文件系统等。这
为开发者提供了丰富的功能来操作文件和目录,满足各种应用程序对
文件系统的需求。
3. 网络编程:WinAPI中的套接字函数提供了网络编程所需的功能
Win系统API大全
Windows API函数大全
1. API之网络函数
WNetAddConnection 创建同一个网络资源的永久性连接
WNetAddConnection2 创建同一个网络资源的连接
WNetAddConnection3 创建同一个网络资源的连接
WNetCancelConnection 结束一个网络连接
WNetCancelConnection2 结束一个网络连接
WNetCloseEnum 结束一次枚举操作
WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接WNetDisconnectDialog 启动一个标准对话框,以便断开同网络资源的连接WNetEnumResource 枚举网络资源
WNetGetConnection 获取本地或已连接的一个资源的网络名称
WNetGetLastError 获取网络错误的扩展错误信息
WNetGetUniversalName 获取网络中一个文件的远程名称以及/或者UNC(统一命名规范)名称
WNetGetUser 获取一个网络资源用以连接的名字
WNetOpenEnum 启动对网络资源进行枚举的过程
2. API之消息函数
BroadcastSystemMessage 将一条系统消息广播给系统中所有的顶级窗口
GetMessagePos 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置GetMessageTime 取得消息队列中上一条消息处理完毕时的时间
PostMessage 将一条消息投递到指定窗口的消息队列
PostThreadMessage 将一条消息投递给应用程序
WindowsAPI大全
WindowsAPI大全
API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
什么是windows API
Windows API是一套用来控制Windows的各个部件(从桌面的外观到为一个新进程分配的内存)的外观和行为的一套预先定义的Windo ws函数.用户的每个动作都会引发一个或几个函数的运行以告诉Wind ows发生了什么.
这在某种程度上很象Windows的天然代码.其他的语言只是提供一种能自动而且更容易的访问API的方法.VB在这方面作了很多工作.它完全隐藏了API并且提供了在Windows环境下编程的一种完全不同的方法. 这也就是说,你用VB写出的每行代码都会被VB转换为API 函数传递给Windows.例如,Form1.Print...VB 将会以一定的参数(你的代码中提供的,或是默认参数)调用TextOut 这个API函数. 。同样,当你点击窗体上的一个按钮时,Windows会发送一个消息给窗体(这对于你来说是隐藏的),VB获取这个调用并经过分析后生成一个特定事件(Butt on_Click).
API函数包含在Windows系统目录下的动态连接库文件中(如Us er32.dll,GDI32.dll,Shell32.dll...).
API 声明
正如在"什么是API"中所说,API函数包含在位于系统目录下的DLL 文件中.你可以自己输入API函数的声明,但VB提供了一种更简单的方法,即使用API Text Viewer. 要想在你的工程中声明API函数,只需运行API Text Viewer,打开Win32api.txt(或.MDB如果你已经把它转换成了数据库的话,这样可以加快速度.注:微软的这个文件有很多的不足,你可以试一下本站提供下载的api32.txt),选择"声明",找到所需函数,点击"
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
有关句柄的概念
• 句柄——用于标识不同的对象和同类对象 中不同的实例的标识符,一个其长度为4 字节长整数值。
• 句柄是Win应用程序编程的基础。应用程 序过句柄访问相应的对象信息。
7
句柄的类型
句柄所标识对象实例
窗口 按钮 图标 滚动条 输出设备 控件 文件 …...。
常用句柄类型
Windows编程基础知识 Windows应用程序常用消息 Windows中的事件驱动程序设计 Windows应用程序组成及编程步骤
1
Windows编程 基础知识
2
Windows的程序设计方法
传统编写法--使用API
(Application Programming Interface)
编写Windows 程序主要工作: *创建对象 *为对象属性赋值
交互式方法--使用MFC
(Microsoft Foundation Class)
3
用MFC库交互式可视化编程
MFC类库含有大量已定义好的类(class), 可根据编程的需要,调用相应的类,或 自定义有关的类 实现可视化交互开发方式
26
(d)显示窗口
由ShowWindow和UpdateWindow显示 调用ShowWindow函数在屏幕上显示窗口
ShowWindow(hwnd,nCmdshow); //nCmdshow为窗口显示形式标识
SW_HIDE SW_SHOWNORMAL SW_SHOWMINIMIZE SW_SHOWMAXMIZE SW_SHOWNOACTIVE SW_RESTORE 隐藏窗口 显示并激活窗口 显示并最小化窗口 显示并最大化窗口 显示但不激活窗口 恢复窗口的原来位置及尺寸
2. 窗口函数WinProc
定义了应用程序对接收到的不同消息的响应
WinProc
包含了对各种可能ຫໍສະໝຸດ Baidu收到的消息的处理过程
WinProc函数由一个或多个switch语句组成。每一条case 语句对应一种消息,当应用程序接收到一个消息时,相应 的case语句被激活并执行相应的响应程序模块。
30
窗口函数的一般形式如下:
wParam和1Param均未用。
16
7. WM_QUIT
退出应用程序时由PostQuitMessage函数发出的消息。 wParam——退出代码,标识退出时的有关信息。 lParam——未用。
8. WM_PAINT
用户区移动或显示 用户窗口改变大小 程序通过滚动条滚动窗口 下拉式菜单关闭并需要恢复被覆盖的部分 均产生 WM_PAINT 消息
2. WM_KEYDOWN:
按下一个非系统键时产生的消息 wParam——按下键的虚拟键码,标识按或放。 lParam——记录按键的重复次数、扫描码、转移代 码及先前键的状态等信息。
相似的消息还有WM_KEYUP, 在放开非系统键时产生
3. WM_ CHAR:
按下一个非系统键时产生的消息 wParam——按下键的ASCII码。 1Param——与WM_KEYDOWN的相同。
25
常用窗口样式
标识 WS_BORDER WS_CAPTION WS_HSCROLL WS_MAXIMIZEBOX WS_MAXIMIZE WS_MINIMIZEBOX WS_MINIMIZE WS_OVERLAPPED WS_OVERLAPPEDWINOW WS_POPUP WS_POPUPWINDOW WS_SYSMENU WS_VSCROLL 说明 创建一带边框的窗口 创建一带标题栏的窗口 创建一带垂直滚动条的窗口 创建一带最大化框的窗口 创建一最大尺寸的窗口 创建一带最小化框的窗口 创建一最小尺寸的窗口 创建一带边框和标题的窗口 创建一带边框、标题栏、系统菜单及最大、 最小化框的窗口 创建一弹出式窗口 创建一带边框和系统菜单的弹出式窗口 创建一带系统菜单的窗口 创建一带水平滚动条的菜单
19
源程序组成结构
1. 所有应用程序的入口, 类似Main函数, 2. 完成一系列的定义和初始化, 并产生消息循环
入口函数WinMain
Windows 应用程序
窗口函数WndProc
构成基 本框架
包含各种 数据类型、 数据结构 与函数等
WinMain和WndProc是 Windows应用程序的主体
11
消息的分类
各种消息分类,分别以不同的前缀表示:
BM —— 按钮控制消息。 CB —— 组合框控制消息。 DM —— 默认下压式按钮控制消息。 EM —— 编辑控制消息。 LB —— 列表框控制消息。 SBM—— 滚动条控制消息。 WM —— 窗口消息。
12
Windows应用程序 常用消息
• 创建窗口实例
– CreateWindow()
• 显示窗口
–ShowWindow() –UpdateWindow()
23
(b)注册窗口类
• Win系统提供部分预定义的窗口类,程序员 也可以自定义窗口类,窗口类必须先注册后 使用。由函数RegisterClass()实现注册。
RegisterClass(&wndclass); //wndclass为窗口类结构 RegisterClass函数的返回为布尔值,注册成功 则返回真
13
1. WM_LBUTTONDOWN:
产生单击鼠标左键的消息,附加信息: lParam——当前光标位置 低字节为X坐标值 高字节为Y坐标值 wParam——一整数值以标识鼠标键的按下状态 MK_LBUTTON 按下鼠标左键 MK_MBUTTON 按下鼠标中键 MK_RBUTTON 按下鼠标右键 此外,类似的鼠标左右键消息还有: WM_LBUTTONUP: 放开左键时产生的消息; WM_RBUTTONDOWN: 单击右键时产生的消息; WM_RBUTTONUP: 放开右键时产生的消息; WM_LBUTTONDBLCLK:双击左键时产生的消息; WM_RBUTTONDBLCLK:双击右键时产生的消息。 14
9
有关消息的概念
• 应用程序利用消息与系统及其它应用程 序进行信息交换。 • 消息的三个组成部分:
– 消息号:由事先定义好的消息名标识 – 字参数(wParam) :用于提供消息的附加信息 – 长字参数(lParam) :用于提供消息的附加信息
附加信息与具体消息号的值有关
10
消息用结构MSG表示
Win是多任务管理的,同一应用程序可能同时存在多个窗口 ,Win系统对每个窗口的执行称为一个实例,并用一个实例 句柄来唯一标识
22
(2) 初始化
• 窗口类的定义:定义窗口的形式与功能
–LoadIcon() –LoadCursor()
• 窗口类的注册:窗口类必须先注册后使用
–RegisterClass()
15
4. WM_CREATE:
由CreateWindow函数发出的消息。
wParam——未用。 lParam——个指向CREATESTRUCT数据 结构的指针。
5. WM_CLOSE:
关闭窗口时产生的消息。
wParam和1Param均未用。
6. WM_DESTROY:
由DestroyWiodow函数发出的消息。
选择所需对象并确定其属性,搭建起应用 程序的“大框架”, 编写必要的细节代码段,构成完整的应用 程序。 4
相关的重要概念
利用API函数和MFC类库编写Windows应用 程序,都必须了解下列有关概念:
窗口(Window) 事件驱动(Event-driven) 句柄(Handle) 消息(Message)
从消息队列中读取 一条消息,并将消 息放在MSG结构中
返回零值,即检索 到WM_QUIT消息,程 序结束循环并退出
其中函数GetMessage形式为: GetMessage (lpMSG, //指向MSG结构的指针 hwnd, nMsgFilteMin, //用于消息过滤的最小消息号值 nMsgFilterMax //用于消息过滤的最大消息号值 29 )
HWND HINSTANCE HCURSOR HFONT HPEN HBRUSH HDC HBITMAP HICON HMENU HFILE 窗口句柄 当前实例句柄 光标句柄 字体句柄 画笔句柄 画刷句柄 设备环境句柄 位图句柄 图标句柄 菜单句柄 文件句柄
8
关于消息及消息队列
操作系统是怎样将感知到的事件传递给应用程序的呢?这是通过消 息机制(Message)来实现的。操作系统将每个事件都包装成一个称 为消息的结构体MSG来传递给应用程序,参看MSDN。 MSG结构定义如下: typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG;
Windows清除对话框等对象,并需要恢复被覆盖的部分 17
Windows应用程序组成 及编程步骤
18
应用程序的组成
• 一个完整的Windows应用程序通常包含 如下几种类型的文件:
–C/C++语言源程序文件(.c或.cpp) –头文件(.h) –模块定义文件(.def) –资源描述文件(.rc) –项目文件(.mak) – …...
5
有关事件驱动的概念
• 事件——一种情况或一种活动的发生、 或一种指定状态的变化,例如,按下鼠 标或键盘的键。
• 事件驱动——是由描述事件发生的信息, 即消息驱动Win程序的执行。
– 程序的执取决于事件发生的顺序; – 消息的产生并不要求有次序之分。
• 事件驱动编程方法
– 针对事件或消息进行处理; – 适于编写交互式程序。
LRESULT CALLBACK WndProc( HWND hwnd, UINT messgae, WPARAM wParam,LPARAM lParam ) { … switch(message) ∥ message为标识的消息 { case … 在消息处理程序段中一般都有对WM_DESTROY的处 … 理,该消息是关闭窗口时发出的。它向应用程序 发出WM_QUIT消息,请求退出处理函数:void break; PostQuitMessage(int nExitCode) …
20
1. WinMain函数
• 三个基本的组成部分:
– 函数说明 – 初始化 – 消息循环
• 功能
– 注册窗口类,建立窗口及初始化
– 进入消息循环,据接受的消息调用相应的处理过程
– 当消息循环检索到WM_QUIT时终止程序运行
21
(1) 函数说明
int WINAPI WinMain ( HINSTANCE hThisInst,∥应用当前实例句柄 HINSTANCE hPrevInst, LPSTR lpszCmdLine, ∥指向命令行参数的指针 Int nCmdShow ∥初始窗口显示方式的整数值标识 )
27
(d)显示窗口(续) • 显示窗口后,调用UpdateWindow更新 并绘制用户区,并发出WM_PAINT消 息。 UpdateWindow(hwnd);
28
(3) 消息循环 Windows将 产生的消息 消 息 队 列
将消息传递给 窗口函数的相 应过程处理
消息循环的常见格式如下: MSG Msg; … while (GetMessage (&Msg,NULL,0,0)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } 将消息的虚拟键 转换为字符信息 将消息传送到 指定窗口函数
24
(c) 创建窗口示例
由函数CreateWindow()创建窗口类的实例。 HWND Create Window ( LPCTSTR lpszClassName, ∥窗口类名 LPCTSTR lpszTitle, ∥窗口标题名 DWORD dwStyle, ∥创建窗口的样式 int x,y, ∥窗口左上角坐标 int nWidth,nHeight, ∥窗口宽度和度高 HWND hwndParent, ∥该窗口的父窗口句柄 HWENU hMenu, ∥窗口主菜单句柄 HINSTANCE hInstance, ∥应用程序当前句柄 LPVOID lpParam ∥指向传递给窗口的参数值的指针 )
typedef struct tagMSG { HWND hwnd; //窗口句柄 UINT message;//消息号,由Winuser.h中的宏定义来标识 WPARAM wParam; //消息的附加信息 LPARAM lParam; //消息的附加信息 DWORD time; //指定消息送至队列的时间 POINT pt; //指定消息发送时屏幕光标的位置, }MSG; typedef struct tagPOINT { LONG x,y; //x和y分别表示屏幕的横坐标和纵坐标 }POINT;