我一直在思考键盘处理问题.它是如何工作的?我似乎无法向我提出一个很好的解释.
我知道每按一次键就会产生键盘中断.处理器停止正在处理的任何内容并从键盘缓冲区加载键盘数据,将其存储在系统级缓冲区中.
但接下来会发生什么?我们来看一个实际的例子吧.运行以下代码时会发生什么:
... std::string s; std::cin >> s; ....
是否cin
从系统级键盘缓冲区的用户级别表示中读取?这在我的头脑中是完全合理的,因为那时2或更多的进程可以从同一缓冲区中读取,并且通过这种方式我不会松开任何按键.但这样做有用吗?
我知道我的谈话非常笼统.我正在使用的操作系统是OS X.
除极少数情况外,您的键盘和显示器由Window Manager管理:X11,Gnome,KDE,Carbon,Cocoa或Windows.
它的工作原理如下.
键盘驱动程序是操作系统的一部分.
窗口管理器是一个特权进程,它在启动期间获取设备.窗口管理器"拥有"设备.只.
中断转到操作系统.
OS通过排队来响应中断.最终 - 当没有更高优先级的时候 - 它从中断中捕获键盘输入并缓冲它.
拥有进程(窗口管理器)正在读取此缓冲区.从此,它创建了键盘事件.
您的应用程序通过窗口管理器工作.
示例1 - 您正在运行命令行应用程序.在终端窗口.当终端窗口位于最前面时,窗口管理器指示终端窗口处的事件.键盘事件成为stdin流.
示例2 - 您正在运行GUI应用程序.在您自己的应用程序窗口中.当应用程序的窗口位于最前面时,窗口管理器会在应用程序窗口中指示事件.键盘事件可供您处理的各种GUI控件使用.某些键盘事件可能会在控件或活动按钮之间循环.