首页

对话框窗口过程返回值的解释  

关于对话框窗口过程返回值 有时候,很多朋友会对对话框窗口过程(Dialog Procedure)的返回值感到疑惑,今天我试着使用一种不同的方法来给大家”翻译翻译”。 对话框过程实际上需要向操作系统返回两种信息: 1) 这个消息是否已经得到了处理? 2) 如果得到了处理,返回值应该是什么? 因为在传统的C语言中,一个函数只能返回一个值,但是在对话框窗口过程中需要返回上述提到的...

新的页面保护层级:可读但不可执行

有时候,你可能会偷些懒 在动态生成某些可执行代码(shellcode)的时候,忘记去执行VirtualProtect(PAGE_EXECUTE)。对于i386这样的处理器来说,这样做并没有什么问题。因为这些处理器并没有带有一个”可读但不可执行”的工作模式,所以在页面上任何可以读取的东西,都是可以被执行的。 关于这个VirtualProtect VirtualProtect是...

关于注册表向后兼容的悲伤故事

当你尝试设计一个操作系统的时候,向后兼容性,是其中一个你不得不考虑的问题。 如果新的应用程序依赖那些为旧版应用程序设计的”小技巧”时,你就得发狂了。 在很久很久以前的一个遥远星系(Windows 95的Beta发布版本的代号是”M3″),我们将那些用来描述特定文件夹的位置的信息保存到了名为”Shell Folders”的注册表...

为什么通过翻转颜色值来实现高亮不是一个好主意  

有些人可能会说:”我们可以通过翻转颜色的RGB值来实现高亮显示,很简单嘛?” 这个做法,可能对于那些黑白显示器可能有效,但是在现代的32位色彩世界里,它就不会那么有效了。 考虑下面的一张图片,你能猜出那张图是翻转之后的吗? 答案是:右边那张是经过RGB翻转过的。 左边的图的背景色是灰色,其RGB值为#808080,右边的图是经过翻转之后的,#808080的翻转值为#7F7...

还有一部分人看不懂模拟时钟

在之前的一篇文章的评论中,我提到过这么一件事:我们在任务栏上不显示模拟时钟,而是显示数字时钟的原因是,有一些人(大概占30% ~ 40%左右,我不记得了)看不懂模拟时钟。就是说,如果任务栏显示是的一个模拟时钟,则他们看不懂到底几点钟了。 你可能会问,那在Windows Vista中还有一侧以侧边栏显示的模拟时钟呀?为什么会这样? 你如果仔细的看看这个侧边栏时钟,你会发现,我们还是将数字时钟显示在了...

技法(但请少用):为非活动窗口绘制活动的标题栏

你可能会问:“为什么会有人想这样做呢?” 这个绘制需求通常用于浮动式工具栏。(除此之外,我想不到还有任何其他理由会将一个非活动窗口的标题栏绘制成活动式的) 幸运的是,这个功能很容易实现。只需要在我们的WndProc窗口过程中添加如下的一行代码即可: case WM_NCACTIVATE: if (wParam == FALSE) wParam = TRUE; break; 这就像是在说:̶...

从一次错误拼写所想到的

一次错误的拼写 在Windows 95那会,我们正在开发即插即用(Plug and Play)功能,有一天我们收到了一家硬件制造商的来信,在这封信中,他们措辞严厉的抱怨我们在INF(Device INFormation File)文件中将他们公司的名字写错了,本来是一个很酷的公司名,由于我们错误的拼写,现在变成了一个非常不礼貌的名字了(这里具体是啥公司,我们不方便透露)。对于一家小有名气的公司来说...

关于写一个排序函数需要注意的

基本原则 当你想写一个排序函数用在ListView_SortItems这样的方法中,或者写一些小玩意来实现IComparer的时候,需要注意排序函数需要遵循以下几个基本原则: > 反身性:Compare(a, a) = 0 > 反对称性:Compare(a, b)必须完全和Compare(b, a)符号相反,其中,0值的符号取反被认为是0本身。 > 传递性:如果Compare(a...

关于那些魔术般的名字(NUL, CON, PRN…)

让我们先回到DOS 1.0那会。 DOS 1.0操作系统不支持子目录,小写文件名或者超过8.3长度的文件名。 当你尝试执行汇编器(Assembler)(或者编译器,你如果够时髦的话)的时候,实际的会有如下的交互式对话发生: A > asm foo // .asm文件后缀会隐式的添加到foo文件名后 Assembler version XXX Source file: FOO.ASM List...

技法:对你的应用添加键盘加速键  

对IsDialogMessage的误解 有一个API函数可能经常容易造成误解,它就是IsDialogMessage。 IsDialogMessage将会判断一个消息是否是针对指定对话框的消息,如果是的话,则会处理这个消息。所以,我们不能从API名字上简单的将它看作是一个判断函数,实际上,它的内部实现代码中还会附带一系列的处理流程。 参数 它的第一个参数是指向一个对话框的窗口句柄,第二个参数是指向一...