《伟大的产品 Windows进化启示录》PDF下载

  • 购买积分:15 如何计算积分?
  • 作  者:(美)Raymond Chen(雷蒙德·陈)
  • 出 版 社:北京:电子工业出版社
  • 出版年份:2016
  • ISBN:9787121278297
  • 页数:454 页
图书介绍:说起Windows系统,很多人都是又爱又恨。它为我们的工作学习生活带来很多便利和乐趣,提供了无数的可能,也带来了不少烦恼。凭借在微软Windows开发团队十多年的工作经验,本书作者Raymond Chen将向你揭示你不可不知的Windows系统内幕。为什么Windows的工作方式是这样的?为什么按“开始”按钮能够关机?为什么GetWindowText函数的行为很奇怪?Windows系统的很多奇怪行为是有逻辑可循的,有其历史原因。帮助你了解Windows这个伟大的产品的进化史,理解Windows产品设计人员在技术和用户体验与设计上的权衡与考量,从其中获得启发。

第1章 用户界面设计初探 1

为什么要单击“开始(Start)”按钮来关机 1

为什么Windows没有“专家模式(expert mode)” 2

对话框的默认按钮是“取消” 3

最好的设置是:即使你没有意识到这些设置的存在,但它们依然按照你所期望的方式在工作 6

为了显示我们的超群智慧,现在就来问一个你回答不了的问题 6

为什么安装程序不会问你是否希望保留操作系统文件的新版本 7

功能设计的思考 9

什么时候应该禁止选项,而什么时候又该删除选项 11

什么时候应该将“...”放在按钮或者菜单项的后面 12

自动售货机的用户界面设计 13

室内门锁的用户界面设计 14

Windows用户界面风格的变迁:扁平化与3D之争 15

第2章 WindoWs95往事 18

为什么在世界地图中,当前时区没有被加亮显示 18

为什么当内存超过1GB时,Windows 95无法启动 19

为什么在Windows 95中有些函数叫作BEAR、BUNNY和PIGLET 21

BOZOSLIVEHERE和TABTHETEXTTOUTFORWIMPS表示什么含义 22

在Windows 95特别版的包装盒中都有些什么东西 23

Windows引出了每个人的罗尔沙赫氏测试 23

登录时的武术图片 25

为什么一个非常大的词典反而不好 25

Windows 95的启动音乐 26

不负责任的技术专栏就是谣言的集散地 27

为什么在“系统属性”页中对内存的大小进行了取整 27

为什么硬盘指示灯每隔几秒钟闪一下 28

寻求更快的系统陷阱 28

一个字节曾经价值一美元 29

每个产品支持电话的成本相当于卖出一个Windows拷贝 30

为什么在Windows的光盘中没有包含Tweak UI 30

不能通过xcopy来安装Windows 32

买下一个Egghead软件商店 33

WindowsPowerToys的典故 33

Windows如何选择最终构建编号 36

为什么在安装系统补丁包时系统的构建编号不会增加 37

第3章 GetWindowText函数的秘密 38

窗口如何管理文本 38

深入了解GetWindowText函数 39

如果我不喜欢这些规则,那该怎么办 40

能否给出一个示例程序来说明这种差异 40

为什么GetWindowText的规则如此奇怪 41

第4章 任务栏与通知区域 43

为什么有些人把任务栏叫作“托盘” 43

为什么任务栏默认是在屏幕的底部 45

为什么在任务栏中的时钟并不显示秒 46

为什么不在任务栏中显示模拟时钟 46

为什么当任务栏竖直停靠时,“开始”按钮上的文本消失了 47

为什么当用户单击“X”按钮时,通知图标不会收到消息 47

第5章 令人困惑的界面问题 48

那些小小的覆盖图标是什么 48

为什么当我登录时,有些不希望看到的文件/文件夹会自动打开 49

对文件来说,文件名字体的颜色代表什么含义 51

为什么在高级选项对话框中,在每个选项后面都会加上“开”或者“关” 52

Alt+Tab中的图标顺序是如何确定的 52

为什么文件夹的“只读”属性非常奇怪 53

当我单击空白任务栏按钮时,这些按钮消失了,发生了什么事 54

“最小化所有窗口”和“显示桌面”之间的区别是什么 55

菜单中的粗体文本表示什么含义 56

自定义的网页图标是从何而来的 57

任务管理器的标签和按钮到哪里去了 58

拖动一个文件是表示移动还是复制 58

为什么“链接”文件夹总是不断地自我创建 59

为什么同时选择多个文档进行打印时,文档的打印顺序是乱的 60

我在产品支持部门的一天 61

吹掉连接器上的灰尘 62

1GB到底表示多少字节 63

为什么不能删除“仅用于测试/评估”的标记 64

第6章 GlobalAlloc函数的历史 65

很久很久以前GlobalAlloc函数是怎么工作的 65

选择符 67

过渡到Win32 69

实现示例 70

第7章 Windows编程中的一些话题 73

“临时”程序 73

获得在标题图标中的自定义右键菜单 78

CreateMenu与CreatePopupMenu有什么区别 80

为什么窗口管理器会自动销毁菜单 82

仅当窗口在屏幕上可见时才进行绘制 82

判断窗口是否被覆盖 86

用位图刷来实现平铺效果 88

DC画刷的好处 90

用ExtTextOut函数来绘制实心矩形 92

用StretchBlt函数来绘制实心矩形 94

在显示字符串时去掉那些难看的方框 95

没有所有者的信号量 102

自动复位事件只是一个毫无意义的信号量 104

第8章 窗口管理 106

为什么会收到伪WM_MOUSEMOVE消息 106

为什么没有WM_MOUSEENTER消息 109

白屏 109

空心画刷的作用 110

桌面窗口有什么特殊的地方 110

禁止窗口和激活窗口的正确顺序 112

恢复窗口位置时的问题 113

界面模态与代码模态 114

WM QUIT消息与模态 117

为模态界面设置正确的所有者窗口 119

与进入模态的程序进行交互 122

定时消息框的简单版本 122

临时窗口 124

在GWLP_USERDATA中的附加窗口数据 125

定时消息框的改进版本 126

定时右键菜单 128

为什么窗口在被销毁之后还会收到消息 128

第9章 关于硬件的回忆录 130

硬件的向后兼容性 130

光驱 131

微软公司的网络:比“地狱”差1.7 倍 132

制造商的尴尬事:在硬件设备的固件中拼错了自己的名字 133

欺骗WHQL的驱动程序认证过程 134

20英尺长的计算机 135

USB手推车 135

检测到了新设备:波音747 136

超频带来的问题 136

第10章 对话框管理器的内部工作机制 139

关于对话框过程 139

对话框模板的发展 150

为什么需要对话框模板 180

对话框是如何创建的 181

模态对话框的消息循环 188

嵌套对话框以及DS_CONTROL 200

为什么需要对话框循环 206

为什么对话框编辑器从100开始设置控件的ID 208

在DefDlgProc函数中做了哪些工作 208

不要将焦点设置在被禁止的控件上 210

在IsDialogMessage中做了什么工作 211

为什么有些消息框中的“X”按钮是被禁止的 218

第11章 常见的软件问题 220

为什么夏令时与我们的直觉不同 220

为什么将文件复制出来时,文件的时间戳会发生变化 222

不要相信返回地址 223

编写排序比较函数 224

可以从另一端来理解契约 225

实用主义和纯粹主义之间的争论 229

优化通常是违背直觉的 230

在服务器上,换页=死机 233

不要保存任何能够重新计算的结果 234

通过增加其他组件的开销来提升性能 235

轮循的性能问题 236

检测内存泄漏的简单方法 237

糟糕的缓存策略将导致内存泄漏 238

第12章 深入研究Visual C++编译器 246

析构函数是在什么时候调用的 246

COM对象的布局 251

调节转换器 253

指向成员函数的指针是非常奇怪的东西 254

什么是purecall 258

第13章 向后兼容性 261

有些应用程序的本意就是要造成崩溃 261

当程序使用未公开的结构时 262

为什么不阻止那些使用了未公开结构的程序 264

为什么16位DOS和16位Windows仍然存在 266

像NUt和CON这些保留文件名的作用是什么 268

为什么(有时候)在UNC路径前面是一个驱动器盘符 269

不要轻视“猎鹿者”这个游戏的威力 270

有时候,游戏中的bug只有在玩了一段时间后才会显现出来 271

Shell Folders键的故事 271

保持错误码的向后兼容性是很重要的 274

没错,我们实现了这个功能 275

有些程序在为操作系统打补丁时将陷入困境 276

即使在内部数据结构中也存在着兼容性问题 277

为什么Windows让BIOS时间保持为本地时间 278

版本号的检测 279

破坏IUnknown::QueryInterface的几种方式 280

当程序假设操作系统永远不会发生改变(一) 282

当程序假设操作系统永远不会发生改变(二) 282

伪显示控制面板 284

伪可视化风格 285

第14章 一些名字的来源和历史 286

在WPARAM和LPARAM中,字母W和L分别表示什么意思 286

为什么在Windows 98中,显示器的最大数量是9 287

为什么注册表文件被叫作蜂窝 287

16位Windows中对资源的内存管理 287

HINSTANCE和HMODULE的区别 288

在WinMain函数中,hPrevInstance参数的作用是什么 291

为什么GlobalWire函数被叫作这个名字 292

LocalAlloc和GlobalAlloc的区别 292

GMEM SHARE标志的作用 295

为什么在转换到LPARAM之前会进行一个多余的转换 295

为什么有些注册表函数的名字以Ex结尾 296

SHGetMalloc,SHAlloc和CoGetMalloc之间的区别 298

为什么Windows错误报告程序的昵称是Dr.Watson 303

DirectX4出了什么问题 304

为什么HANDLE类型的返回值如此不一致 305

为什么文本文件是以Ctrl+Z来结束的 307

为什么行结束符是CR+LF 307

TEXT、_TEXT与_T,UNICODE与_UNICODE 308

为什么对话框在初始创建时是隐藏的 309

当程序在内部做修改时,没有人会注意 309

如果FlushInstructionCache没有做任何事情,为什么还要调用这个函数 311

如果InitCommonControls没有做任何事情,为什么还要调用这个函数 311

为什么InterlockedIncrement/InterlockedDecrement这两个函数只是返回结果的符号 312

为什么会存在WSASetLastError函数 313

为什么在Windows中使用基于广播的机制 313

在任务栏出现之前,窗口最小化之后被放到了什么地方 314

为什么在计算桌面窗口大小时会把任务栏也包含在内 316

为什么在按下Alt键时,光标将停止闪烁 316

ES_OEMCONVERT风格的作用 317

在文件系统隧道背后隐藏的故事 319

为什么NTFS和资源管理器在对文件名进行排序时是不一致的 320

日期/时间控制面板并不是日历 322

Windows 95如何重新设定DLL的加载基址 323

SYSTEM_FONT和DEFAULT_GUI_FONT是什么字体 326

为什么上下控件中的箭头与大多数人的直觉是相反的 326

Windows 95发布会的门票 327

第15章 窗口消息的发送与接收 329

发送消息和投递消息 329

发送消息的生命期 334

投递消息的生命期 335

生成的投递消息 337

SendMessageCallback将在什么时候调用回调函数 339

当消息超时后,SendMessageTimeout函数将执行什么操作 340

澄清一些关于消息处理的谬论 340

如何知道消息的发送者/投递者 341

不能用PostMessage来模拟键盘输入 342

第16章 国际化编程 343

在Unicode上做大小写映射是很困难的 343

令人啼笑皆非的大小写映射错误 344

为什么不能旋转文字 345

0409和1033是些什么目录 348

注意编码页 349

为什么默认的8比特编码页叫作“ANSI” 356

为什么默认的控制台编码页叫作“OEM” 357

为什么OEM编码页经常被叫作“ANSI” 358

在Unicode和ANSI之间的转换结果既是合理的但也是奇怪的 359

第17章 安全 361

所有用户都有写操作权限的文件 361

在资源管理器中隐藏文件 362

窃取密码 363

未验证驱动程序的静默安装 364

调试代码可能是一个安全漏洞 365

为什么共享数据段是一个安全漏洞 366

IE的增强安全配置并不信任内部网络 369

第18章 Windows2000和WindowsXP 371

为什么在Windows XP“开始”菜单的“所有程序”列表中没有智能菜单 371

为什么没有定义可以访问“开始”菜单中快速启动列表的函数接口 372

为什么Windows XP Service Pack 2有时候会忘记CD自动播放设置 374

不安全设备删除对话框 375

关于WindowsXP中“Comments”按钮的两段回忆 376

为什么资源管理器在刻录完光盘之后会把光盘弹出来 376

为什么Windows安装程序会生成新的启动扇区 377

超自然力调试法:为什么在四处理器的机器中有三个处理器没有发挥作用 378

超自然力调试法:为什么CPU使用率总在50%上下徘徊 379

DS_SHELLFONT标志的作用 379

为什么DS_SHELLFONT=DS_FIXEDSYS|DS_SETFONT 381

DS_SHELLFONT在属性页上的效果 381

第19章 Win32中的设计问题 383

为什么当无法解析某个导入函数时,Win32就不会加载这个模块 383

为什么要仔细检查结构的大小 384

为什么必须为了WM_DEVICECHANGE返回一个奇怪的值 387

程序和用户之间的战争 388

为什么不能截获TerminateProcess函数调用 389

为什么有些进程在被终止之后还停留在任务管理器中 389

理解WAIT_ABANDONED所带来的结果 390

为什么不能把超链接放在通知图标的气球提示中 392

为什么在树型控件中不能重复使用同一个节点 394

奇怪的STRRET结构 394

为什么不能把UTF-8设置为系统的ANSI编码页 396

什么时候应该使用下沉的客户区 397

为什么没有包罗万象的Windows版本 397

为什么可能发生禁止桌面窗口的情况 398

窗口和菜单的嵌套限制分别是多少 399

HWND_TOP和HWND_TOPMOST的区别 399

第20章 税赋 401

分级存储管理 402

地缘政治学 403

远程桌面连接与绘制 403

快速用户切换和终端服务 406

多用户 407

漫游用户配置文件 408

重定向文件夹 410

“我的文档”与“应用程序数据” 413

大地址空间 413

电源管理和检测电池的电量 417

间歇性的网络连接 419

反走样字体和ClearType技术 420

高DPI显示 423

多显示器 427

工作区 429

在正确的位置上显示弹出窗口 431

辅助功能 431

第21章 轻松一刻 439

容易误解的“空”操作 439

不要让市场部门搞砸你的幻灯片 439

异想天开的Bug报告 440

小心示例URL 441

任何代码都不是孤立的 441

我在ViusalBasic方面很专业 442

半透明的塑料 443

我遭遇的第一次死亡威胁 443

你无法摆脱这些AOLCD 444

在接入电脑的电源之前发出严正警告 445

蜘蛛纸牌不再排名第一 445

关于Rat Poker的一些事情 446

为产品小组取名时请三思 447

讨论组的命名心理学 448

经理和程序员的区别 448

将软盘作为信号量 449

当一个标志中途改变了它代表的含义 449

把异想天开的尴尬作为一种温和的指责方式 450

“当日开发员”的帽子 451

办公室里的迪士科舞会 451

万圣节主题的大厅 452