none
关于多进程窗口的焦点问题 RRS feed

  • 问题

  • 程序主要架构:
    主进程是一个MDI程序,在这个主进程中创建了多个子进程,然后将子进程的主窗口设置成主进程的子窗口的子窗口(将主进程窗口和子进程窗口建立起了父子窗口的关系),这个子进程用来加载一些模块(ocx),正常情况下运行良好,当主进程中某个child获得处于激活状态的时候,焦点自然转移到了子进程窗口中,效果就跟在同一个进程中一样。
    问题:
    子进程所加载的模块内部实现是我不能控制的,在他们的内部可能会弹出一些模态框(焦点当然就在模态框上),当这个模态框还没有关闭的时候,子进程被强行Terminate掉了(实际使用中可能是因为这个模块出现程序错误直接飞掉),这个时候焦点没有被交还给主窗口,这样就导致整个主窗口不能获得焦点,不能响应任何的鼠标好键盘输入,就像程序僵死一样,但实际上主进程的主线程并没有卡死,还能够正常的处理消息,就是不能获得焦点。我使用SetFocus和SetForegroundWindow都不能将焦点设回给主窗口。

    请问各位大侠,因为子进程直接飞掉是我完全不能预判的行为,但是当它已经推出后,我有一个后台的监视程序会告诉我这个进程已经不在了,这个时候我有什么办法能够直接将焦点设置给当前的窗口?

    2009年7月18日 16:28

答案

  • 如果具有当前焦点的窗口被销毁,Windows会尝试把焦点给其父窗口
    但是在窗口被销毁的时候,父窗口仍旧是被禁用状态,无法接受焦点,所以Windows会另找一个窗口。
    因为你的程序是崩溃而不是可控销毁,你无法在崩溃之前检测到崩溃并且将父窗口启用。

    Please mark the post answered your question as the answer, and click the chartreuse pyramid floating over "Vote as helpful" to mark other helpful posts as helpful. This posting is provided "AS IS" with no warranties, and confers no rights.
    Visual C++ MVP
    • 已标记为答案 yxlan 2009年7月20日 5:18
    2009年7月19日 9:43
    版主

全部回复

  • 没有,Windows会把焦点给一个随机的窗口。

    Please mark the post answered your question as the answer, and click the chartreuse pyramid floating over "Vote as helpful" to mark other helpful posts as helpful. This posting is provided "AS IS" with no warranties, and confers no rights.
    Visual C++ MVP
    2009年7月18日 18:28
    版主
  • 自己顶一下,各位大哥,帮忙啊~~~~~~~~~~~~~~~~~
    2009年7月19日 2:48
  • 没有,Windows会把焦点给一个随机的窗口。

    Please mark the post answered your question as the answer, and click the chartreuse pyramid floating over "Vote as helpful" to mark other helpful posts as helpful. This posting is provided "AS IS" with no warranties, and confers no rights.
    Visual C++ MVP

    您说的随机窗口指的是本进程的吗?如果在一个随机的窗口上,那为什么我不能点击任何窗口啦?只要在这个进程里面,能够有一个窗口可以供我点击,理论上来说就可以把焦点设置回来
    2009年7月19日 2:54
  • 版主,我认为正常情况下,系统确实是会将焦点给一个随机的窗口,如果是这样也就ok了,但是从我的测试看,恰好就是因为系统没有把焦点从一个已经不存在的模态框上面收回来,因为这个模态框是直接被系统销毁,没有经过KillFocus消息的处理,而系统还认为焦点在这个程序的某个窗口上。
    这里有一点问题不是很清楚,按照我之前的理解,系统应该保证当前的任意一个进程都会有一个焦点的,即使认为该焦点还被其中的一个子窗口所拥有,当我使用SetFocus来设置焦点的时候发现拥有焦点的窗口已经不存在了,那么也应该把焦点收回来给一个正常存在的窗口才对啊,可是我现在却不鞥把焦点给设回来,有什么好的方法好建议啊?
    2009年7月19日 3:27
  • 如果具有当前焦点的窗口被销毁,Windows会尝试把焦点给其父窗口
    但是在窗口被销毁的时候,父窗口仍旧是被禁用状态,无法接受焦点,所以Windows会另找一个窗口。
    因为你的程序是崩溃而不是可控销毁,你无法在崩溃之前检测到崩溃并且将父窗口启用。

    Please mark the post answered your question as the answer, and click the chartreuse pyramid floating over "Vote as helpful" to mark other helpful posts as helpful. This posting is provided "AS IS" with no warranties, and confers no rights.
    Visual C++ MVP
    • 已标记为答案 yxlan 2009年7月20日 5:18
    2009年7月19日 9:43
    版主
  • 对,这就是问题所在,现在我的父窗口就一直处于被禁用状态,我想知道的是,在这种状态下有没有其他的什么办法能够让父窗口激活?
    2009年7月20日 1:42