控制台输入缓冲区

【勇芳软件工作室】汉化HomePreviousNext

每个控制台都有一个包含输入事件记录队列的输入缓冲区。当控制台的窗口具有键盘焦点时,控制台将每个输入事件(例如单个按键,鼠标移动或鼠标按钮单击)格式化为控制台输入缓冲区中的输入记录。

应用程序可以通过使用高级控制台I / O功能间接访问控制台的输入缓冲区,也可以直接使用低级控制台I / O功能。高级输入功能对输入缓冲区中的数据进行过滤和处理,只返回输入字符流。低级输入功能可使应用程序直接从控制台的输入缓冲区读取输入记录,或将输入记录放入输入缓冲区。

输入记录是包含有关发生的事件类型(键盘,鼠标,窗口大小调整,焦点或菜单事件)的信息的结构以及有关事件的具体细节。INPUT_RECORD结构中的EventType成员指示记录中包含哪种类型的事件。

焦点和菜单事件放置在控制台的输入缓冲区中,供系统内部使用,应由应用程序忽略。

键盘事件

任何键按下或释放时都会产生键盘事件;这包括控制键。但是,ALT键在Windows与其他字符组合时按下并释放时具有特殊的意义,而不会传递给应用程序。此外,如果输入句柄处于处理模式,则CTRL + C组合键不会传递。

如果输入事件是击键,则事件中的事件成员是KEY_EVENT_RECORD结构,其中包含以下信息:

*一个布尔值,表示该键是按下还是释放。

*按住一个键时,重复计数可以大于1。

*虚拟键代码,以设备无关的方式识别给定的键。

*虚拟扫描码,表示由键盘硬件产生的与设备有关的值。

*翻译的Unicode或ANSI字符。

*指示控制键(ALT,CTRL,SHIFT,NUM LOCK,SCROLL LOCK和CAPS LOCK键)的状态的标志变量,并指示是否按下增强键。IBM 101键和102键键盘的增强键是数字键盘左侧的集群中的INS,DEL,HOME,END,PAGE UP,PAGE DOWN和箭头键以及除数(/)和ENTER键在数字键盘。

鼠标事件

只要用户移动鼠标或按下或释放其中一个鼠标按钮,就会生成鼠标事件。仅当符合以下条件时,才会将鼠标事件放置在输入缓冲区中:

*控制台输入模式设置为ENABLE_MOUSE_INPUT(默认模式)。

*控制台窗口具有键盘焦点。

*鼠标指针位于控制台窗口的边框内。

如果输入事件是鼠标事件,事件中的事件成员是一个MOUSE_EVENT_RECORD结构,其中包含以下信息:

*根据屏幕缓冲区坐标系中的字符单元格行和列,鼠标指针的坐标。

*一个标志变量,指示鼠标按钮的状态。

*指示控制键(ALT,CTRL,SHIFT,NUM LOCK,SCROLL LOCK和CAPS LOCK)的状态并指示是否按下增强键的标志变量。IBM 101键和102键键盘的增强键是数字键盘左侧的集群中的INS,DEL,HOME,END,PAGE UP,PAGE DOWN和箭头键以及除数(/)和ENTER键在数字键盘。

*一个标志变量,指示事件是正常按钮按钮还是按钮释放事件,鼠标移动事件或双击事件的第二次单击。

请注意,鼠标的位置坐标是屏幕缓冲区,而不是控制台窗口。屏幕缓冲区可能已经相对于窗口滚动,因此窗口的左上角不一定是屏幕缓冲区的(0,0)坐标。要确定鼠标相对于窗口坐标系的坐标,请从鼠标位置坐标中减去窗口原点坐标。使用GetConsoleScreenBufferInfo功能确定窗口原点坐标。

dwButtonState结构的dwButtonState成员对应于每个鼠标按钮。如果按钮为关,该位为1,如果按钮为向上,该位为0。MOUSE_EVENT_RECORD dwEventFlags成员的0值检测到按钮释放事件,并将按钮位从1更改为0。GetNumberOfConsoleMouseButtons功能可以检索鼠标的按钮数量。

缓冲区调整大小事件

控制台窗口的菜单使用户可以更改活动屏幕缓冲区的大小;此更改生成缓冲区大小调整事件。如果控制台的输入模式设置为ENABLE_WINDOW_INPUT(即默认模式被禁用),缓冲区大小调整事件将放置在输入缓冲区中。

如果输入事件是一个缓冲区大小调整事件,INPUT_RECORD INPUT_RECORDINPUT_RECORD成员是WINDOW_BUFFER_SIZE_RECORD结构,其中包含以字符单元格列和行表示的屏幕缓冲区的新大小。

如果用户减小屏幕缓冲区的大小,则丢失的缓冲区部分中的任何数据都将丢失。

由于应用程序调用{??989796072}功能,屏幕缓冲区大小的更改不会生成为缓冲区大小调整事件。