首页

使用消息过滤器找回丢失的线程消息  

如前面的文章所提到的,线程消息在模态循环中会丢失,因为消息分发器(Message Dispatcher)不知道应该如何分发此消息。但是,如果模态循环能支持的话,我们有一种方法可以在它们消失之前看到它们。 WH_MSGFILTER 消息钩子可以用来接收传递给 CallMsgFilter 函数的消息。幸运的是,窗口管理器中的所有模态循环都使用 CallMsgFilter 来允许线程在线程消息丢失之前捕...

消失的线程消息  

在上一篇文章中,我们介绍到,模态消息循环会吃掉线程消息。 今天的文章中,我们将会演示这个场景,并在将来的文章中尝试修复这个问题。 还是基于我们的例子程序,然后做一些修改,如下图所示: 试着运行这个修改后的例子程序,你会发现,它会每隔2秒钟发出蜂鸣声,至少大部分时间它是这样的。 如果你右键单击标题栏或抓住窗口边缘开始调整大小或拖动滚动条或执行拖放择或显示消息框,则蜂鸣声会停止。 那是因为,所有上...

模态消息循环会吃掉线程消息  

线程消息(例如,你通过PostThreadMessage发送给线程的消息)在传递给DispatchMessage函数的时候,不会去任何地方。 如果你仔细琢磨一下,就会明白,这是很显然的一件事情:因为这个线程消息没有关联到一个窗口句柄。DispatchMessage对这种没有关联窗口的消息,它不知道如何处理。 它不得不将这个消息简单地丢弃。 这对进入模态循环的线程产生了可怕的后果,任何带有窗口的线程...

新的例子程序  

我想,是时候修改下我们一直以来使用的例子程序的代码了。我听说最近有一门新的语言叫C++,它看起来变得非常流行。那我也赶一下时髦。 代码如下 首先,我定义了一个Window窗口类,里面包含一些创建一个窗口所需要的各种小部件,例如窗口句柄,注册窗口,创建窗口,窗口处理过程函数等。类的头文件如下图所示: 接下来,是对应的类实现代码。 我们还定义了一个继承自Window的类RootWindow,重写...

说说安腾处理器的双栈设计  

去年的时候,我曾提到,在安腾(Itanium)处理器上有两个栈。 传统上的”栈”(包括SP寄存器所指的那个栈)是一个手动管理的内存块,函数可以从中分配空间以在执行期间使用。 举个例子,如果你声明一个局部变量: TCHAR szBuffer[MAX_PATH]; 那么,这个缓冲区将会在上面所说的栈中分配内存。 但是,不是所有的局部变量都分配在这个栈中。 回想一下,安腾处理器上...

设备上下文(DC)画刷的妙用  

当我们调用GetStockObject(DC_BRUSH),所返回的是一个与设备上下文(Device Context,简称DC)相关联的DC画刷。它和系统颜色画刷有点类似,DC画刷的颜色会动态修改。但它们俩有个区别:系统颜色画刷的颜色会根据系统的颜色动态修改,而DC画刷的颜色是根据你下发的指令来修改。 当你在很短的时间内需要一个纯色颜色画刷的时候,DC画刷是比较方便的,因为它总是存在于系统中,所以...

向Visual Studio Code导入ST项目  

在ARM处理器的世界,有着很多的半导体厂家,其中最大之一是ST。 ST拥有大量的产品型号,这些产品具有多种功能以及用于它们对应的开发板。ST自家也提供了一个开发环境STM32CubeIDE,用来在ST设备上进行开发。另外他们也提供了一个配置工具STM32CubeMX,它用于配置设备属性并生成项目的配置信息。 如果你已经参与过基于ST的项目,我不会告诉你任何新内容。你可能不知道我们为在 Visual...

从文件资源管理器中隐藏文件  

在默认情况下,资源管理器不会显示拥有FILE_ATTRIBUTE_HIDDEN属性的文件,因为有人特意隐藏了这些文件。 如果你希望显示这些文件,则可以在资源管理器的选项设置中勾选“显示隐藏的文件和文件夹”来显示它们。勾选了这个选项之后,即使文件被标记了FILE_ATTRIBUTE_HIDDEN属性,资源管理器仍然会显示它们,如下图所示: 让我们再进一层,如果文件被同时标记了FILE_...

为什么需要传递HINSTANCE给CreateWindow?  

Win32中有两个API函数,CreateWindow和RegisterClass。它们有一个HINSTANCE参数,很多人对这个参数不是很理解,今天就来讲一讲。 窗口类的名称还不足以唯一地确定这个窗口类。每一个进程都会拥有它自己的窗口类列表,而在这个列表中的每个条目都会包含一个实例句柄和一个窗口类名称。 举个例子,如果一个程序有两个 DLL,这两个 DLL 都注册了一个类名“MyClass”,并...

使用数学的力量来简化多级比较  

今天的标题确实是无聊。 有些时候,你可能需要进行一项多级计算。最为常见的例子是对一个包含有主版本号和次版本号的版本信息进行检查。错误的版本号检查是最常见的错误来源之一。 如果你正在编写代码检查版本数字,则可以使用VerifyVersionInfo这个函数,我在此假设你正在为Windows 2000及更新版本的Windows操作系统编写代码。 您可以将待比较的数值打包到单个比较操作中,而不是编写多级...