C ++ winAPI基础 - 通过窗口切换

时间:2012-02-15 17:52:39

标签: c++ winapi

不太清楚如何以清晰的方式解释它。基本上,问题是我正在寻找一种方法来改变当前活动窗口(自制def。,希望它足以理解) - 窗口,其中文本现在直接输入。 Whooh。

我已经发现的是msdn帮助和SetFocus()或SetActiveWindow(),但它并没有解决我的问题(或者,也有可能,我只是使用它以错误的方式)。

简单地:

HWND Dest = GetFocus();
... //Some moving around on the 'alt-tab level' :-|
SetFocus(Dest); 

不会再将Dest窗口设置为活动状态。 请原谅新手问题,希望它不会花费你很多时间。感谢名单!

2 个答案:

答案 0 :(得分:3)

SetFocus()不会将窗口置于顶部。它只是设置键盘焦点。

另一方面,

SetActiveWindow()将特定窗口置于顶部,但前提是调用它的应用程序也是拥有它的应用程序。 (根据文件)。

当你说你尝试过SetActiveWindow()时,你是什么意思?怎么会失败?它产生了什么结果?

您可以尝试的另一个功能是SetForegroundWindow(),以防您想要激活属于另一个应用程序的窗口但是这有问题,如下所示(直接来自文档):

  

系统限制哪些进程可以设置前景窗口。一个   只有在以下情况之一时,进程才能设置前台窗口   条件是真的:

     
      
  • 该过程是前台进程。
  •   
  • 该过程由前台进程启动。
  •   
  • 该过程收到了最后一个输入事件。
  •   
  • 没有前台进程。
  •   
  • 正在调试前台进程。
  •   
  • 未锁定前景(请参阅LockSetForegroundWindow)。
  •   
  • 前台锁定超时已过期(请参阅SystemParametersInfo中的SPI_GETFOREGROUNDLOCKTIMEOUT)。
  •   
  • 没有菜单处于活动状态。
  •   

答案 1 :(得分:2)

尝试使用SetForegroundWindow功能。

请注意,这方面存在一些限制,MSDN页面备注部分对此进行了解释,我已将其复制到此处。

  

系统限制哪些进程可以设置前景窗口。一个   只有在以下情况之一时,进程才能设置前台窗口   条件是真的:

     
      
  • 该过程是前台进程。该过程由前台进程启动。
  •   
  • 进程收到最后一个输入事件。
  •   
  • 没有前台进程。
  •   
  • 正在调试前台进程。
  •   
  • 前景未锁定(请参阅LockSetForegroundWindow)。
  •   
  • 前台锁定超时已过期(请参阅SystemParametersInfo中的SPI_GETFOREGROUNDLOCKTIMEOUT)。
  •   
  • 没有菜单处于活动状态。
  •   
     

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

这意味着如果您不拥有当前的前台进程(当用户选中时可能就是这种情况),那么您就无法设置新的前景窗口。

周围有几个黑客(google SetForegroundWindow,你会发现它们),但它们是黑客并且不是一个好主意 - 让用户决定前景中的内容!(同样如Raymond Chen解释在他的博客here上,黑客通常会导致程序挂起)