用了windows或者Linux的都差不多知道有个任务栏,以便从一任务切换至另一任务,也不会出现一个任务运行后,或者抛出异常后回不到先前的窗口,或者说是失去焦点了。那任务栏在某些时候就显得比较重要了,这也可以通过Alt+Tab键实现焦点切换。
     不过,现在有种设计是要消除任务栏,甚至那两个键的作用,从而有一种结果是老是出现某个窗口失去焦点不能操作。
     如何去消除这种问题呢?第一种是程序自身抢焦点,但抢来抢去,抢走了别人的焦点,有时又失去了自己的焦点,从而操作要么不好,要么没解决掉。另一种,我想也许应该有个焦点优先队列方式,即,焦点在哪个窗口上应该知道,当一个窗口抢走一个焦点后,那么当它退出时应该把焦点还给先前的窗体。不管怎么说windows当前只有一个焦点可以用,不能有两个焦点同时用。但其运行的任务可能会有好几个的,那这几个任务何时进行与用户的交互呢?或者都需要也是有可能的,可以根据紧迫程度抢前一个焦点一直运行到不在用还回焦点,应该还回的。在没还回前其它也可以根据紧迫程度抢当前的焦点,比如某种异常等。
     如果想这样,那焦点也应该没有问题了,那为什么还要任务栏呢?是所谓的用户等不及了,要抢先调度吗?如果不抢先调度就让用户等当前焦点失去还给它了?可以吗?可能没有那么方便了。像我现在正在写日志,但我突然想做点其它事,等一会再写,那如果不切换,我不是必须要写完这个才能做其它事了呢?所以我觉得任务栏和那两个键还是很有必要的。
    如果没任务栏和那两个键,程序失去教点是怎么回事呢?比如说一个程序通过shell去调另一个可执行程序,另一个可执行程序获得焦点后全屏运行然后退出,那此时焦点归谁呢?按理说应该说是前一个程序,但桌面需要重绘,于是前一个程序失去交点,需要前面方式或鼠标什么的重新激活焦点了。
     如何让shell调用的焦点从被调用的直接回到调用的呢?我想也许可以通过进程间通信来实现了,但我的同事不赞同,说进程间通信不能完全成功,但我想通信一般不会失败的,即使失败了也可以再来几次,难道一次都不成功吗?我相信自己的想法,但也许他改程序改多累了,况且我也做不了主,毕竟实际经验才两年,面试也不是那么好,他可是C++满壶经论的,时间也比我长多了。
     不知道有没有哪位高手能指出一两点看法啊?

解决方案 »

  1.   

    字太多没看明白...
    Windows现在是通过一个z order stack来确定焦点的
      

  2.   

    当系统初始化时,要建立一个特殊的线程,即原始输入线程(rawinputthread,RIT)。此外,系统还要建立一个队列,称为系统硬件输入队列(Systemhardwareinputqueue,SHIQ)。RIT和SHIQ构成系统硬件输入模型的核心。
    当一个用户在系统上登录时,WindowsExplorer进程让一个线程建立相应的任务栏(taskbar)和桌面。这个线程连接到RIT。如果你又要产生Calculator,那么就又有一个线程来建立一个窗口,并且这个线程变成连接到RIT的线程。注意现在WindowsExplorer的线程不再与RIT连接,因为在一个时刻只能有一个线程同RIT连接。当一个按键消息进入SHIQ时,RIT就被唤醒,将这个事件转换成适当的按键消息,并将消息放入与RIT连接的线程的虚拟输入队列。
    不同的线程是如何连接到RIT的呢?我们已经说过,当产生一个进程时,这个进程的线程可以建立一个窗口。这个窗口处于前景,其建立窗口的线程同RIT相连接。另外,RIT还要负责处理特殊的键组合,如Alt+Tab、Alt+Esc和Ctrl+Alt+Del等。因为RIT在内部处理这些键组合,就可以保证用户总能用键盘激活窗口。应用程序不能够拦截和废弃这些键组合。当用户按动了某个特殊的键组合时,RIT激活选定的窗口,并将窗口的线程连接到RIT。Windows也提供激活窗口的功能,使窗口的线程连接到RIT。
    让线程独立地处理输入、防止线程之间相互有不利的影响,这些只是实现强壮输入模型工作的一部分,如果仅有这些特性.不足以保证线程相互之间的隔离。所以系统还要有另外的基础设施。这个基础设施称作局部输入状念(1ocal input state)。
        每个线段都有自已的局部输入状态、并在线程的THREADINF0结构内进行管理(THREADINFo结构在第26章讨论过)。这个局部输人状态由线程的虚拟输入队列和一组变量构成。这些变量用来跟踪下面的输入状念管理信息:
    键盘输入和窗口焦点信息.例如:
    •哪一个窗口有键盘焦点:
    .哪一个窗口是活动的。
    .哪一个键被认为是按下的。
    .插入符号的状态
    这些变量还跟踪鼠标光标的管理信息,例如:
    哪一个窗口有鼠标捕获。
    鼠标光标的形状。
    鼠标光标的可见性。
    由于每个线程都有自己的输入状态变量,每个线程都有不同的焦点窗口、鼠标捕获窗口等概念。从一个线程的角度来看,或者它的某个窗口拥有键盘焦点,或者系统中没有窗口拥有键盘焦点;或者它的某个窗口拥有鼠标捕获,或者系统中没有窗口拥有鼠标捕获,等等。
    《Windows核心编程》 第27章 硬件输入模型和局部输入状态