仅以此文献给有一定基础的 C/C++ 想学好 Windows 编程的读者。

我本科学的地理专业,没错就是培养高中地理老师的那个地理专业,当时凭个人兴趣,自学了 Web 开发和 Flash 编程。虽然选修了 C 语言,但只能写出一些黑洞洞的控制台程序,特别好奇像 QQ、360 这种桌面程序是怎么写出来的。
直到大四毕业前夕,我遇到了两本书,这两本改变了我的人生轨迹。
一、我的工作经历
毕业以后,我非 Windows C/C++ 工作不做,最后得偿所愿。先后做过股票交易系统的客户端,类似这种:

是不是看起来挺复杂的?掌握了原理,其实一点不复杂。
我为了帮助大家学习,写了一个简易的股票客户端程序,现在开源出来给大家学习:
👆打开关注 回复「股票源码」即可获取源码
通俗地说,Windows 有界面的程序的基本原理是:
步骤一:注册窗口类;
步骤二:利用窗口类创建窗口;
步骤三:进入消息循环队列,触发 Windows 消息处理各个消息。
后来我去二三四五继续做 Windows C/C++ 开发,参与的项目是二三四五的战略软件的开发。所谓战略软件是二三四五不以盈利为目的的几款口碑比较好的软件,如好压、看图王、王牌浏览器、二三四五输入法。
那个时候,还给自己 PS 了一个章鱼头像:

如果你对这些软件背后的原理很感兴趣,可以看下金山卫士的源码或者紫光拼音输入法的源码,它们都开源了,我整理了一套可以直接编译、运行、调试的版本,分享一下:
金山卫士

源码获取:
👆打开关注 回复「金山卫士」即可获取源码
紫光拼音输入法

紫光拼音输入法开源的确在我意料之外的。
源码地址:
https://github.com/balloonwj/unispim
二、学习方法
就我个人而已,我接触 Windows 编程,已经十多个年头了,尤其是在我读研的三年内,基本心思都是花在学习和研究 Windows 程序上了,工作以后一直做到 PC 端开发负责人。
我很庆幸我当初学习 Windows 程序走了一条正确的路线:
先是学习常用的 Windows 程序原理和基本 API,再学习的 MFC、WTL 等一些常用的框架和类库,同时看了大量 Windows 项目的源码,如金山卫士的开源代码、Filezilla、电驴源码等等。
个人觉得,基础真的很重要,拿 Windows 开发来说,当你掌握了 Windows 程序的基本原理,我列一下大致范围:
-
Windows 消息机制(消息如何产生、如何发送、如何处理,常见的消息有哪些、消息的优先级、如何自定义消息、窗体消息、常用控件消息)
-
GDI 原理(要熟悉 GDI 的各种对象,如画笔、画刷、字体、区域、裁剪、位图等,熟悉它们的 API,熟悉各种 GDI 绘图 API、当然最好也要熟悉一整套的 GDI+ 的类,GDI 与 GDI+ 的区别)
-
Windows 进程与线程的概念(进程的概念、如何创建、如何结束、跨进程如何通信;线程的创建与销毁、线程间的同步与资源保护,熟悉 Windows 常用的线程同步对象:临界区、事件、互斥体、信号量等)
-
Windows 内存管理(清晰地掌握一个进程地址空间的内存分布、Windows 堆的创建与管理等)
-
DLL 技术(DLL 的生成、变量的导出、函数的导出、类的导出、如何查看 DLL 导出哪些函数、隐式 dll 的加载、显式的 DLL 的加载、远程 DLL 注入技术等)
-
PE 文件(一个 PE 文件的结构、有哪些节、如何修改、分别映射到进程地址空间的什么位置等)
-
Windows SEH(结构化异常处理)
-
Windows Socket 编程
-
Windows 读写文件技术(像 CreateFile、WriteFile、GetFileSize 等这些API应该熟练掌握、内存映射技术)
当然很多必备的技术也不好归类到 Windows 技术下面,比如 Socket 编程,这涉及到很多网络的知识,例如 TCP 的三次握手、数据的收发等,还有就是各种字符编码的知识以及之间的相互转换,又比如一系列的 CRT 函数及其对应的宽字符版本。
我在知乎上专门开了一个 live 介绍 Windows 开发必知必会的技术,有兴趣的可以戳这里:
https://www.zhihu.com/lives/909740192015998976
当然如果你搞 Windows 开发,一定要熟悉开发工具 Visual Studio,熟悉其工程项目的大多数属性配置,而且要做到知其然也知其所以然。
如果不是不能跨平台,我敢说 Visual Studio 是史上最好最强大的开发工具,没有之一!
我现在的主业已经不再是 Windows 开发了,目前主要从事服务端开发,但 Windows 的很多设计思想真的很好,非常值得借鉴,而且从编码风格来说,虽然看起来有点怪异,但是非常规范和易懂。
有了基础知识,你可以轻松地对工作中的一些问题给出解决方案,也能轻松阅读和使用市面上的那些库,比如,如果你深刻理解 Windows GDI,你不会在一个群里大喊,duilib 某个属性为什么不起作用,你可以直接去阅读它的画法代码,如果是 bug 你可以改 bug,如果只是你使用错误,你可以了解到正确的使用方法。
所以基础这个东西,在短时间内,可能让你看不出与其他人的差别,但是从长远来看,它决定着你在技术之路上攀多高、走多远。套用侯捷先生的一句话:勿在浮沙筑高台。
三、推荐的书籍
如果你对 Windows C/C++ 编程感兴趣,我推荐两本书:
1.《Windows 程序设计》
这本书讲述了 Windows UI 相关原理的方方面面,且语言朴实、娓娓道来,犹如一位良师益友,我当初也是看这本书进入 Windows C/C++ 开发领域的;这本书的业界地位很高,可以说这本书是中国的老一代 Windows 程序员的启蒙和进阶读物。
2. 《Windows 核心编程》

这本书正好与上一本相互弥补,讲述的是 Windows 非 UI 部分的运行原理,内容非常丰富,当之“核心”二字无愧,图书的作者是编写 Windows Sysinternals 套件的 Jeffrey Richter,如果你没听说过 Windows Sysinternals 套件,那你一定听说过 Process Explorer:
侯捷老师评价这本书是“搞 Windows 开发,需要两样资源,一是 MSDN,一本就是《Windows 核心编程》”,这本书口碑非常好,多次重印,每一版都有一些新的改动和惊喜。这本书你不要指望一下子就能读懂每一个章节,这本书的很多章节其实非常难懂的,比如 SEH 章节、自旋锁相关章节。随着你对 Windows 程序的原理的不断深入可以回过头来翻这本书,你会发现当初看的懵懵懂懂的文字,竟然都是金玉良言,所以这本书要带在身边,经常翻一翻。
👆打开关注 回复「Windows开发」即可上述图书pdf版
最后,祝每一位读者都能得偿所愿!

