首页

为什么 FindFirstFile 会查找短文件名?  

FindFirstFile 函数会尝试匹配短文件名和长文件名。这可能会产生一些令人惊讶的结果。例如,如果你查找 “*.htm” ,那么它会返回给你文件 “x.html” ,因为它的短文件名是 “X~1.HTM”。 这确实比较令人感到意外。 为什么 FindFirstFile 会匹配短文件名呢?它不应该只匹配长文件名吗?毕竟,只...

说说SYSTEM_FONT和DEFAULT_GUI_FONT的区别  

如果你对 GDI 有所研究,在调用 GetStockObject 时,你应该应该碰到过这两个字体:SYSTEM_FONT 和 DEFAULT_GUI_FONT,那么它们有什么区别呢? 实际上,它们是没有人再使用的字体。 在 Windows 2.0 的古老时代,对话框使用的字体是一个位图字体,被称之为 System。 这个字体就是通过 SYSTEM_FONT 来获取的,而且为了保持兼容性,它依然是对...

关于对 DeferWindowPos 的理解  

DeferWindowPos 这个 API 的目标是:同一时间,移动多个子窗口。这在一定程度上减少了窗户移动时进行的重绘工作量。 修改我们之前的例子代码,如下图所示: 请注意,我正在使用控件 ID 来保存所需的颜色,我们在选择背景颜色时在获取它。 我特意调用了 Sleep,这样就可以看到实际的绘制效果。 我们将两个子窗口并排放置在工作区中。对于我们的第一次测试,我们将使用 SetWindow...

Windows为什么使用广播机制更新信息?  

很多 Windows 信息通知机制是基于广播消息,例如,DDE,WM_FONTCHANGE 消息和系统设置的修改等。 当我们知道,消息的广播可能导致系统由于某个窗口停止处理消息而导致整个停止时,为什么我们还是使用广播呢? 因为在16位 Windows 中,你没有这个问题。 回想一下,16位 Windows 是协作式多任务处理的。当一个程序获得对 CPU 的控制权时,它可以做任何它想做的事情,因为它...

为什么WinXP SP2有时候会忘记CD自动播放的设置?  

实际上,它并没有忘记,它只是想和你再次确认一下。 这是 Windows XP2 负责开发 CD 自动播放组件的工程师和我说的。 在 Windows XP 中,处理 CD 自动播放时会有两个问题。 第一,当你安装了一个新的可以处理 CD 自动播放的应用程序时,很多用户不知道在哪里可以设置使用新的应用来作为 CD 自动播放的默认程序。 如果用户之前选择一个程序并勾选了“始终执行此操作”,则他很难知道在...

strncpy很危险,但是为什么VS2005还支持它?  

之前网络上有专门的一则新闻,描述了为什么 strncpy 如此危险,在此之后,至少有一个人要求Visual Studio 开发团队移除对这个危险函数的支持。考虑到对函数的持续支持,要求编译器制造商对使用该编译器编译的程序中的任何缺陷负责。 嗯,一方面,虽然如果使用不当,strncpy确实很危险,但它仍然是一个有效的函数,我最初的讨论解释了strncpy 背后的历史以及它仍然有用的非常具体的场景。 ...

请勿使用PostMessage来模拟键盘输入  

有些人希望通过向窗口的输入消息队列发送键盘消息,来实现键盘的模拟。 从很多方面来说,这不大靠谱,为何? 首先,键盘输入比那些印在英文键盘上的字母要复杂得多。带有重音符号的语言有死键(Dead Key),远东语言有各种输入法编辑器,我不知道复杂的脚本语言如何处理输入。 这意味着,键入字符不仅仅是按一个键,而可能是按下一个组合键。 其次,即使你有办法将输入消息投递到目标窗口的消息队列中,也不会更新键盘...

来,想一下:x/2 在什么时候不等于 x>>1?  

地球人都知道,在计算机的世界,乘法和除法可以使用移位来实现,例如下面的两条等式: x * 2 ≡ x << 1 x / 2 ≡ x >> 1 但实际上,有时候事情并不是你想的那样。在C语言标准中,没有要求有符号整数的内部表示为2的补码。 在计算机中,对于一个正数会有一个统一的表示法,但如果这个数字是一个负数,则它可以有不同的表示。 如果 x 是一个负数,那么,x * 2 和...

SetCursor的效果仅持续到下一个SetCursor调用  

当然,SetCursor 函数对线程的影响只会持续到该线程将光标更改为其他内容为止。任何白痴都知道,对吧? 棘手的部分是,SetCursor 可能来自一个意想不到的地方。 人们最常遇到这种情况的地方是当他们做这样的事情时: // Put up the hourglass HCURSOR hcurPrev = SetCursor(hcurWait); … do some processi...

为什么动态链接库以”错误”的方式被卸载?  

当程序启动或加载 DLL 时,加载器将生成该程序/DLL 引用的所有 DLL、该 DLL 的依赖项等的依赖项树。然后,它确定初始化这些 DLL 的正确顺序,以便在初始化它所依赖的所有 DLL 之前,不会初始化任何 DLL。 (当然,如果你有一个循环依赖关系,那么它就会崩溃。众所周知,从 DLL 的DLL_PROCESS_ATTACH 通知中调用加载库函数或 LoadLibraryEx 函数也会弄乱...