windows.h 是 Windows API 的核心头文件之一

windows.h 是 Windows API 的核心头文件之一,用于开发 Windows 应用程序和系统应用。它包含了与 Windows 操作系统相关的众多功能和结构体。以下是对 windows.h 的全面深入介绍:

1. 概述

windows.h 提供了访问 Windows 操作系统功能的接口,包括窗口管理、图形界面、消息处理、文件操作、进程和线程管理等。它是 Windows 应用程序开发的基础头文件。

2. 主要功能

  • 窗口管理

    • 窗口类和窗口 :定义和管理窗口,包括创建窗口 (CreateWindow)、窗口消息处理 (WndProc)、窗口销毁 (DestroyWindow) 等。
    • 消息处理 :处理和响应窗口消息,如 WM_PAINTWM_DESTROY 等。
  • 图形界面

    • 绘图函数 :提供绘图功能的函数,例如 BeginPaintEndPaintDrawTextBitBlt 等。
    • GDI(图形设备接口):支持图形和文本的输出,包括画笔、画刷、字体、图像处理等。
  • 文件操作

    • 文件和目录操作 :例如 CreateFileReadFileWriteFileDeleteFileFindFirstFileFindNextFile 等。
  • 进程和线程管理

    • 进程控制 :创建和终止进程,例如 CreateProcessTerminateProcessGetProcessId 等。
    • 线程管理 :创建和同步线程,例如 CreateThreadWaitForSingleObjectSuspendThreadResumeThread 等。
  • 内存管理

    • 内存分配和释放 :例如 VirtualAllocVirtualFreeGlobalAllocGlobalFreeHeapCreateHeapAlloc 等。
  • 系统信息

    • 获取系统信息 :例如 GetSystemInfoGetVersionEx 等。
  • 消息框和对话框

    • 显示消息框 :例如 MessageBox
    • 对话框 :创建和管理对话框,如 DialogBoxCreateDialogEndDialog 等。

3. 常用结构体和类型

  • HWND:窗口句柄。
  • HDC:设备上下文句柄,用于绘图操作。
  • HINSTANCE:应用程序实例句柄。
  • HANDLE:通用句柄,用于表示各种资源,如文件、线程等。
  • MSG:消息结构体,用于传递窗口消息。
  • WNDCLASS:窗口类结构体,用于定义窗口的行为和样式。

4. 常见宏和常量

  • WM_PAINT:窗口绘制消息。
  • WM_DESTROY:窗口销毁消息。
  • SW_SHOW:窗口显示模式。
  • GENERIC_READGENERIC_WRITE:文件访问模式。
  • CREATE_NEWCREATE_ALWAYS:文件创建模式。

5. 包含 windows.h 的注意事项

  • 预处理指令windows.h 可能会包含大量其他头文件,影响编译时间。
  • 宏定义冲突:一些库可能定义了与 Windows API 冲突的宏。
  • 多重包含windows.h 通常会使用 #ifndef#define 预处理指令来防止多重包含。

以下是一个简单的示例,展示如何使用 windows.h 创建一个基本的窗口应用程序:

cpp 复制代码
#include <windows.h>  // 包含 Windows API 的头文件

// 窗口过程函数:处理窗口的消息
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {  // 根据消息类型执行不同的处理
        case WM_DESTROY:  // 处理窗口销毁消息
            PostQuitMessage(0);  // 发送退出消息,结束消息循环
            return 0;  // 处理完消息后返回 0
        case WM_PAINT:  // 处理窗口绘制消息
            {
                PAINTSTRUCT ps;  // 画布绘制结构体
                HDC hdc = BeginPaint(hwnd, &ps);  // 开始绘制,获取设备上下文
                FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));  // 填充窗口背景为白色
                EndPaint(hwnd, &ps);  // 结束绘制
            }
            return 0;  // 处理完消息后返回 0
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);  // 对未处理的消息调用默认处理程序
}

// 程序入口函数
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    const char CLASS_NAME[] = "Sample Window Class";  // 窗口类名

    // 定义并初始化窗口类
    WNDCLASS wc = {0};
    wc.lpfnWndProc = WindowProc;  // 指定窗口过程函数
    wc.hInstance = hInstance;  // 当前实例句柄
    wc.lpszClassName = CLASS_NAME;  // 窗口类名

    RegisterClass(&wc);  // 注册窗口类

    // 创建窗口
    HWND hwnd = CreateWindowEx(
        0, CLASS_NAME, "Sample Window", 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 0;  // 消息循环退出后,返回程序执行结果
}

注释解释

  1. 头文件包含

    • #include <windows.h>:包含 Windows API 的头文件,提供访问 Windows 操作系统功能的接口。
  2. 窗口过程函数 (WindowProc)

    • LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) :窗口过程函数,用于处理窗口的各种消息。
      • switch (uMsg):根据消息类型选择处理方法。
      • case WM_DESTROY :处理窗口销毁消息,调用 PostQuitMessage 发送退出消息。
      • case WM_PAINT :处理窗口绘制消息,使用 BeginPaintEndPaint 进行绘制操作。
      • return DefWindowProc(hwnd, uMsg, wParam, lParam):对未处理的消息调用默认处理程序。
  3. 程序入口函数 (WinMain)

    • int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) :程序的入口点。
      • const char CLASS_NAME[]:定义窗口类名。
      • WNDCLASS wc = {0}:定义并初始化窗口类结构体。
      • RegisterClass(&wc):注册窗口类。
      • CreateWindowEx:创建窗口,指定窗口类、标题、样式等参数。
      • ShowWindow(hwnd, nCmdShow)UpdateWindow(hwnd):显示和更新窗口。
      • while (GetMessage(&msg, NULL, 0, 0)):消息循环,从消息队列中获取消息并分发到窗口过程函数。

总结

这段代码演示了一个基本的 Windows 应用程序框架,包括窗口的创建、显示、消息处理和消息循环。通过详细的注释,可以更好地理解每个函数的作用和消息的处理过程。


cpp 复制代码
#include <windows.h>
#include <tlhelp32.h>  // 包含工具帮助函数的头文件

#define ID_LISTBOX 1  // 定义列表框控件的ID

// 函数声明
void PopulateProcessList(HWND hwndListBox);

// 函数:填充进程列表到列表框
void PopulateProcessList(HWND hwndListBox) {
    HANDLE hProcessSnap;           // 进程快照句柄
    PROCESSENTRY32 pe32;           // 进程信息结构体

    // 创建系统进程的快照
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hProcessSnap == INVALID_HANDLE_VALUE) {
        // 快照创建失败,返回
        return;
    }

    pe32.dwSize = sizeof(PROCESSENTRY32);  // 设置结构体大小

    // 获取第一个进程的信息
    if (!Process32First(hProcessSnap, &pe32)) {
        // 获取第一个进程失败,关闭句柄并返回
        CloseHandle(hProcessSnap);
        return;
    }

    // 遍历所有进程
    do {
        // 将进程名添加到列表框中
        SendMessage(hwndListBox, LB_ADDSTRING, 0, (LPARAM)pe32.szExeFile);
    } while (Process32Next(hProcessSnap, &pe32));  // 获取下一个进程的信息
    
    // 关闭进程快照句柄
    CloseHandle(hProcessSnap);
}

// 窗口过程函数:处理窗口的消息
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    static HWND hwndListBox;  // 列表框句柄,静态变量在窗口过程函数中保留

    switch (uMsg) {
        case WM_CREATE: {
            // 创建列表框控件
            hwndListBox = CreateWindow(
                "LISTBOX", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | LBS_NOTIFY,
                10, 10, 300, 400, hwnd, (HMENU)ID_LISTBOX, ((LPCREATESTRUCT)lParam)->hInstance, NULL
            );
            // 填充进程列表到列表框中
            PopulateProcessList(hwndListBox);
            return 0;
        }
        case WM_DESTROY:
            // 处理窗口销毁消息,发送退出消息并终止应用程序
            PostQuitMessage(0);
            return 0;
    }
    // 默认处理其他消息
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

// 程序入口点
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    const char CLASS_NAME[] = "Sample Window Class";  // 窗口类名

    WNDCLASS wc = {0};  // 窗口类结构体初始化
    wc.lpfnWndProc = WindowProc;  // 窗口过程函数
    wc.hInstance = hInstance;  // 应用程序实例句柄
    wc.lpszClassName = CLASS_NAME;  // 窗口类名

    // 注册窗口类
    RegisterClass(&wc);

    // 创建窗口
    HWND hwnd = CreateWindowEx(
        0, CLASS_NAME, "Process List Window", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 400, 500,
        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 0;
}

详细解释:

  1. 头文件和宏定义

    • #include <windows.h>#include <tlhelp32.h>:引入必要的Windows API和工具帮助函数的头文件。
    • #define ID_LISTBOX 1:定义列表框控件的ID,方便在窗口过程函数中引用。
  2. PopulateProcessList 函数

    • HANDLE hProcessSnap:保存进程快照的句柄。
    • PROCESSENTRY32 pe32:保存进程信息的结构体。
    • CreateToolhelp32Snapshot:创建系统进程快照。
    • Process32FirstProcess32Next:遍历进程列表。
    • SendMessage:将进程名添加到列表框中。
    • CloseHandle:关闭进程快照句柄。
  3. WindowProc 函数

    • 处理窗口消息。
    • WM_CREATE:创建窗口时调用,创建并初始化列表框,调用 PopulateProcessList 填充进程列表。
    • WM_DESTROY:窗口销毁时调用,发送退出消息。
    • 其他消息通过 DefWindowProc 进行默认处理。
  4. WinMain 函数

    • 入口点函数,设置并注册窗口类,创建窗口,显示窗口,进入消息循环。

这个程序创建了一个窗口,并在窗口中显示系统的所有进程名,使用列表框控件展示信息。


cpp 复制代码
#include <windows.h>

#define ID_BUTTON 1  // 定义按钮的 ID

// 窗口过程函数:处理窗口的消息
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        case WM_PAINT:
            {
                PAINTSTRUCT ps;
                HDC hdc = BeginPaint(hwnd, &ps);
                FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));
                EndPaint(hwnd, &ps);
            }
            return 0;
        case WM_COMMAND:
            if (LOWORD(wParam) == ID_BUTTON) {  // 处理按钮点击消息
                MessageBox(hwnd, "按钮被点击了!", "消息", MB_OK | MB_ICONINFORMATION);
            }
            return 0;
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    const char CLASS_NAME[] = "Sample Window Class";

    WNDCLASS wc = {0};
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = CLASS_NAME;

    RegisterClass(&wc);

    HWND hwnd = CreateWindowEx(
        0, CLASS_NAME, "Sample Window", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, NULL, hInstance, NULL
    );

    if (hwnd == NULL) {
        return 0;
    }

    // 创建按钮
    CreateWindow(
        "BUTTON",  // 按钮控件的类名
        "点击我",  // 按钮的文本
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  // 按钮的样式
        10, 10, 100, 30,  // 按钮的位置和大小
        hwnd,  // 父窗口
        (HMENU)ID_BUTTON,  // 按钮的 ID
        hInstance,  // 实例句柄
        NULL  // 附加数据
    );

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

WIN32_FIND_DATA 结构是 Windows API 中用于存储通过 FindFirstFileFindFirstFileExFindNextFile 函数找到的文件系统对象(如文件和目录)的信息的结构。它提供了关于每个找到的对象的详细属性信息。

cpp 复制代码
#include <windows.h>
#include <stdio.h>

void list_files(const char *path) {
    WIN32_FIND_DATA findFileData;
    HANDLE hFind = FindFirstFile(path, &findFileData);

    if (hFind == INVALID_HANDLE_VALUE) {
        // Correct format specifier for DWORD (unsigned long)
        printf("FindFirstFile failed (%lu)\n", (unsigned long)GetLastError());
        return;
    }

    do {
        // 检查文件是否是目录
        if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
            printf("Directory: %s\n", findFileData.cFileName);
        } else {
            printf("File: %s\n", findFileData.cFileName);
        }
    } while (FindNextFile(hFind, &findFileData) != 0);

    FindClose(hFind);
}


int main() {
    list_files("C:\\Users\\Administrator\\Documents\\*"); // 使用 * 列出所有文件和目录
    return 0;
}


// WIN32_FIND_DATA 结构体定义
// typedef struct _WIN32_FIND_DATA {
//     DWORD dwFileAttributes;       // 文件的属性
//     FILETIME ftCreationTime;      // 文件的创建时间
//     FILETIME ftLastAccessTime;    // 文件的最后访问时间
//     FILETIME ftLastWriteTime;     // 文件的最后写入时间
//     DWORD nFileSizeHigh;          // 文件大小的高32位
//     DWORD nFileSizeLow;           // 文件大小的低32位
//     DWORD dwReserved0;            // 保留字段
//     DWORD dwReserved1;            // 保留字段
//     TCHAR cFileName[MAX_PATH];    // 文件名
//     TCHAR cAlternateFileName[14]; // 文件的备用名称
// } WIN32_FIND_DATA;

// 字段说明
// dwFileAttributes:
// 文件或目录的属性标志。可以是下列之一(或其组合):
// FILE_ATTRIBUTE_DIRECTORY:这是一个目录。
// FILE_ATTRIBUTE_ARCHIVE:文件已更改,自上次备份以来。
// FILE_ATTRIBUTE_HIDDEN:文件是隐藏文件。
// FILE_ATTRIBUTE_READONLY:文件是只读的。
// FILE_ATTRIBUTE_SYSTEM:文件是系统文件。
// FILE_ATTRIBUTE_NORMAL:文件没有其他属性(除了存储和读/写访问)。
// ftCreationTime:
// 文件或目录的创建时间。类型为 FILETIME 结构体,用于表示日期和时间。
// ftLastAccessTime:
// 文件或目录的最后访问时间。类型为 FILETIME 结构体。
// ftLastWriteTime:
// 文件或目录的最后写入时间。类型为 FILETIME 结构体。
// nFileSizeHigh 和 nFileSizeLow:
// 文件的大小。由于文件大小可能大于 2GB,因此它被分为高 32 位 (nFileSizeHigh) 和低 32 位 (nFileSizeLow)。
// dwReserved0 和 dwReserved1:
// 保留字段,通常不需要使用或设置这些字段。
// cFileName:
// 文件的名称。这个字段是一个数组,最大长度为 MAX_PATH(通常为 260 个字符)。
// cAlternateFileName:
// 文件的备用名称,通常用于 DOS 兼容性。这个字段的长度为 14 个字符。

Windows编程涉及的内容非常广泛,涵盖了从基本的窗口创建到复杂的消息处理、图形绘制、文件操作、网络通信等多种功能。以下是一些Windows编程的核心内容和概念的概览:

1. 窗口管理

  • 创建和显示窗口 :使用CreateWindowCreateWindowEx函数创建窗口,并通过ShowWindowUpdateWindow函数显示和更新窗口。
  • 窗口过程 :窗口过程函数(WindowProc)用于处理窗口消息(如鼠标点击、键盘输入、窗口重绘等)。
  • 消息循环 :在WinMain函数中,通过GetMessageTranslateMessageDispatchMessage函数进行消息循环,确保程序响应用户操作。

2. 控件和对话框

  • 控件 :如按钮、编辑框、列表框等,使用CreateWindowCreateWindowEx函数创建,并通过SendMessage函数与控件交互。
  • 对话框 :使用DialogBoxCreateDialog函数创建和管理对话框,处理对话框中的消息。

3. 绘图和图形

  • 设备上下文(DC) :用于绘制图形的环境,获取方法包括BeginPaintGetDC
  • 绘图函数 :如DrawTextEllipseRectangle等,用于绘制文本、图形等。
  • GDI+:提供更高级的绘图功能,如图像处理和渐变填充。

4. 消息处理

  • 消息定义 :Windows系统的消息定义在winuser.h中,如WM_PAINTWM_COMMANDWM_DESTROY
  • 消息映射:将特定消息映射到处理函数。

5. 文件和资源管理

  • 文件操作 :使用CreateFileReadFileWriteFile等函数进行文件操作。
  • 资源 :使用资源文件(.rc)定义应用程序的资源,如图标、菜单、对话框等,通过LoadResourceFindResource等函数加载和使用资源。

6. 进程和线程

  • 进程管理 :使用CreateProcess函数创建新进程,TerminateProcess结束进程。
  • 线程管理 :使用CreateThread函数创建线程,WaitForSingleObject等函数等待线程结束。

7. 网络编程

  • Winsock :提供网络编程功能,使用WSAStartup初始化,socket创建套接字,connectsend进行网络通信。

8. API调用

  • Windows API :使用系统提供的API函数进行各种操作,如MessageBoxSetWindowText等。

9. COM编程

  • 组件对象模型(COM) :用于创建可重用的对象组件,通过CoInitializeCoCreateInstance等函数进行操作。

10. 高级主题

  • 多媒体编程:使用DirectX、Windows Media Player等进行音视频处理。
  • 安全性:处理权限、加密等安全相关问题。

学习建议

  • 从基础开始:首先掌握基本的窗口创建和消息处理。
  • 逐步深入:逐步学习更复杂的控件、图形绘制、文件操作等。
  • 参考文档 :使用官方文档(如Microsoft Docs),阅读相关的教程和书籍。
  • 实践项目:通过实际项目和代码实践来加深理解。

Windows编程确实很复杂,但通过逐步学习和实践,可以掌握这些技术并运用到实际应用中。

相关推荐
弗锐土豆3 小时前
Windows系统中Oracle VM VirtualBox的安装
windows·虚拟机·virtualbox
秋の花4 小时前
【JAVA基础】Java集合基础
java·开发语言·windows
零意@6 小时前
ubuntu切换不同版本的python
windows·python·ubuntu
写bug的小屁孩8 小时前
前后端交互接口(三)
运维·服务器·数据库·windows·用户界面·qt6.3
hairenjing112310 小时前
在 Android 手机上从SD 卡恢复数据的 6 个有效应用程序
android·人工智能·windows·macos·智能手机
plmm烟酒僧13 小时前
Windows下QT调用MinGW编译的OpenCV
开发语言·windows·qt·opencv
Jtti15 小时前
Windows系统服务器怎么设置远程连接?详细步骤
运维·服务器·windows
小奥超人16 小时前
PPT文件设置了修改权限,如何取消权?
windows·经验分享·microsoft·ppt·办公技巧
hairenjing11231 天前
使用 Mac 数据恢复从 iPhoto 图库中恢复照片
windows·stm32·嵌入式硬件·macos·word
九鼎科技-Leo1 天前
了解 .NET 运行时与 .NET 框架:基础概念与相互关系
windows·c#·.net