WinApi:在新线程中将键盘焦点置于新窗口

时间:2013-07-04 17:35:17

标签: c++ winapi keyboard focus accessibility

当用户按下网页上的按钮时,我有一个浏览器插件调用的dll。这个dll包含创建一个窗口的本机代码(在一个新的UI线程中),我需要这个窗口来获得键盘关注它的创建(用户期望的行为)。我不是想在用户的脸上推出一个不需要的弹出窗口。

我试过使用SetForegroundWindow(),SetFocus(),BringWindowToTop(),AttachThreadInput(),最小化/恢复窗口,你给它命名,我试过了。我所取得的最大进步是让新窗口在任务栏中闪烁。

我需要能够做到这一点的原因是因为我需要考虑键盘的可访问性,并允许用户使用我的新窗口而不必使用alt-tab。

有没有人对如何在这里获得键盘焦点有任何建议?

1 个答案:

答案 0 :(得分:3)

如果任务栏上的窗口闪烁,那么您的代码不符合SetForegroundWindow() documentation中列出的要求:

  

只有在以下情况之一时,进程才能设置前台窗口   条件是真的:

     

该过程是前台过程。

     

该过程由前台进程启动。

     

该过程收到了最后一个输入事件。

     

没有前台进程。

     

正在调试前台进程。

     

前景未锁定(请参阅LockSetForegroundWindow)。

     

前台锁定超时已过期(请参阅SystemParametersInfo中的SPI_GETFOREGROUNDLOCKTIMEOUT)。

     

没有菜单处于活动状态。

     

应用程序无法强制窗口到达前台   而用户正在使用另一个窗口。相反,Windows   闪烁窗口的任务栏按钮以通知用户。