searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Windows系统硬件输入模型

2023-07-19 08:26:11
15
0

       本文将讨论Windows操作系统的硬件输入模型。具体来说,我们将研究击键和鼠标事件是如何进入系统并被分派到适当的窗口过程的。微软输入模型的主要目标之一是确保一个线程的动作不会对另一个线程的动作产生负面影响。这里有一个来自16位Windows的例子:如果一个任务进入了无限循环,所有的任务都被挂起,不能再响应用户。用户必须重启计算机。这给了单一任务太多的控制权。健壮的操作系统,如Windows 2000和Windows 98,不允许挂起的线程阻止系统中的其他线程接收硬件输入。

click to view at full size.

图1 系统硬件输入模型

       图1总结了系统的硬件输入模型。当系统初始化时,它会创建一个称为原始输入线程(RIT)的特殊线程。此外,系统会创建一个名为系统硬件输入队列(SHIQ)的队列。RIT和SHIQ构成了系统硬件输入模型的核心。 RIT通常会休眠,等待一个条目出现在SHIQ中。当用户按下并释放按键、按下并释放鼠标按钮或移动鼠标时,硬件设备的设备驱动程序会将一个硬件事件附加到SHIQ,从而唤醒RIT。然后,RIT从SHIQ中提取条目,并将事件翻译成适当的WM_KEY*、WM_?BUTTON*,或WM_MOUSEMOVE消息。翻译后的消息被附加到适当线程的虚拟化输入队列(VIQ)中(在第26章讨论)。然后RIT循环返回,等待更多的消息出现在SHIQ中。因为RIT执行仅由微软编写的代码,并且因为这些代码经过严格测试,所以RIT永远不会停止对硬件输入事件的响应。 那么RIT如何知道将硬件输入消息附加到哪个线程的虚拟化输入队列中呢?对于鼠标消息,RIT简单地决定鼠标光标下的窗口。使用窗口,RIT调用GetWindowThreadProcessId来找出哪个线程创建了窗口。返回的线程ID标识哪个线程获得鼠标消息。 击键硬件事件的工作方式略有不同。在任何给定的时间,一个线程被“连接”到RIT。该线程被称为前台线程,因为它创建了用户与之交互的窗口,并且该线程的窗口相对于由其他线程创建的窗口而言处于前台。

       当用户登录到系统时,Windows资源管理器进程有一个创建任务栏和桌面的线程。这个线程连接到RIT。如果你现在生成计算器,它有一个创建窗口的线程,这个线程连接到RIT。请注意,Windows资源管理器的线程不再连接到RIT,因为RIT一次只能连接一个线程。所以现在,当一个击键消息进入SHIQ时,RIT简单地唤醒,将事件翻译成适当的击键消息,并将消息放入连接线程的虚拟化输入队列中。 那么不同的线程是如何连接到RIT的呢?正如我刚才解释的,当一个进程产生时,这个进程的线程可以创建一个窗口。这个窗口来到前台,它的线程连接到RIT。此外,RIT还负责处理特殊的按键序列,如Alt+Tab、Alt+Esc和Ctrl+Alt+Del。因为RIT在内部处理这些按键序列,所以保证了用户总是可以用键盘激活windows应用程序无法截取并丢弃这些按键序列。当用户按下一个特殊的键序列时,RIT激活所选的窗口,并将其线程连接到RIT。Windows还提供激活窗口的函数,使窗口的线程连接到RIT。这些功能将在本章后面讨论。 从图27-1中,你可以看到线程是如何相互保护的。如果RIT为窗口B1或窗口B2分派消息,则该消息进入线程B的虚拟化输入队列。在处理消息时,线程B在对内核对象进行同步时可能会进入无限循环或死锁。如果发生这种情况,线程B仍然连接到RIT,更多的消息可能被附加到线程B的虚拟化输入队列中。 然而,用户可能会注意到窗口B1和B2都没有响应,并且可能想要切换到窗口A1。要进行切换,用户需要按Alt+Tab。由于RIT处理Alt+Tab组合键,用户总是可以毫无问题地切换到另一个窗口。在选择窗口A1之后,线程A被连接到RIT。此时,即使线程B和它的两个窗口都没有响应,用户也可以将输入输入到窗口A1。

0条评论
0 / 1000
m****n
4文章数
0粉丝数
m****n
4 文章 | 0 粉丝
m****n
4文章数
0粉丝数
m****n
4 文章 | 0 粉丝
原创

Windows系统硬件输入模型

2023-07-19 08:26:11
15
0

       本文将讨论Windows操作系统的硬件输入模型。具体来说,我们将研究击键和鼠标事件是如何进入系统并被分派到适当的窗口过程的。微软输入模型的主要目标之一是确保一个线程的动作不会对另一个线程的动作产生负面影响。这里有一个来自16位Windows的例子:如果一个任务进入了无限循环,所有的任务都被挂起,不能再响应用户。用户必须重启计算机。这给了单一任务太多的控制权。健壮的操作系统,如Windows 2000和Windows 98,不允许挂起的线程阻止系统中的其他线程接收硬件输入。

click to view at full size.

图1 系统硬件输入模型

       图1总结了系统的硬件输入模型。当系统初始化时,它会创建一个称为原始输入线程(RIT)的特殊线程。此外,系统会创建一个名为系统硬件输入队列(SHIQ)的队列。RIT和SHIQ构成了系统硬件输入模型的核心。 RIT通常会休眠,等待一个条目出现在SHIQ中。当用户按下并释放按键、按下并释放鼠标按钮或移动鼠标时,硬件设备的设备驱动程序会将一个硬件事件附加到SHIQ,从而唤醒RIT。然后,RIT从SHIQ中提取条目,并将事件翻译成适当的WM_KEY*、WM_?BUTTON*,或WM_MOUSEMOVE消息。翻译后的消息被附加到适当线程的虚拟化输入队列(VIQ)中(在第26章讨论)。然后RIT循环返回,等待更多的消息出现在SHIQ中。因为RIT执行仅由微软编写的代码,并且因为这些代码经过严格测试,所以RIT永远不会停止对硬件输入事件的响应。 那么RIT如何知道将硬件输入消息附加到哪个线程的虚拟化输入队列中呢?对于鼠标消息,RIT简单地决定鼠标光标下的窗口。使用窗口,RIT调用GetWindowThreadProcessId来找出哪个线程创建了窗口。返回的线程ID标识哪个线程获得鼠标消息。 击键硬件事件的工作方式略有不同。在任何给定的时间,一个线程被“连接”到RIT。该线程被称为前台线程,因为它创建了用户与之交互的窗口,并且该线程的窗口相对于由其他线程创建的窗口而言处于前台。

       当用户登录到系统时,Windows资源管理器进程有一个创建任务栏和桌面的线程。这个线程连接到RIT。如果你现在生成计算器,它有一个创建窗口的线程,这个线程连接到RIT。请注意,Windows资源管理器的线程不再连接到RIT,因为RIT一次只能连接一个线程。所以现在,当一个击键消息进入SHIQ时,RIT简单地唤醒,将事件翻译成适当的击键消息,并将消息放入连接线程的虚拟化输入队列中。 那么不同的线程是如何连接到RIT的呢?正如我刚才解释的,当一个进程产生时,这个进程的线程可以创建一个窗口。这个窗口来到前台,它的线程连接到RIT。此外,RIT还负责处理特殊的按键序列,如Alt+Tab、Alt+Esc和Ctrl+Alt+Del。因为RIT在内部处理这些按键序列,所以保证了用户总是可以用键盘激活windows应用程序无法截取并丢弃这些按键序列。当用户按下一个特殊的键序列时,RIT激活所选的窗口,并将其线程连接到RIT。Windows还提供激活窗口的函数,使窗口的线程连接到RIT。这些功能将在本章后面讨论。 从图27-1中,你可以看到线程是如何相互保护的。如果RIT为窗口B1或窗口B2分派消息,则该消息进入线程B的虚拟化输入队列。在处理消息时,线程B在对内核对象进行同步时可能会进入无限循环或死锁。如果发生这种情况,线程B仍然连接到RIT,更多的消息可能被附加到线程B的虚拟化输入队列中。 然而,用户可能会注意到窗口B1和B2都没有响应,并且可能想要切换到窗口A1。要进行切换,用户需要按Alt+Tab。由于RIT处理Alt+Tab组合键,用户总是可以毫无问题地切换到另一个窗口。在选择窗口A1之后,线程A被连接到RIT。此时,即使线程B和它的两个窗口都没有响应,用户也可以将输入输入到窗口A1。

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0