繁体   English   中英

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

[英]C++ winAPI basics - switching through windows

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

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

只是:

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

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

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

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

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

您可以尝试的另一个函数是SetForegroundWindow() ,以防您想要激活属于另一个应用程序的窗口但是从下面看到这有问题(直接来自文档):

系统限制哪些进程可以设置前景窗口。 仅当满足下列条件之一时,进程才能设置前台窗口:

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

尝试使用SetForegroundWindow函数。

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

系统限制哪些进程可以设置前景窗口。 仅当满足下列条件之一时,进程才能设置前台窗口:

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

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

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

周围有几个黑客(谷歌SetForegroundWindow,你会发现它们),但它们是黑客而不是一个好主意 - 让用户决定前景中的内容! (也可作为雷蒙德陈解释说在他的博客在这里的黑客往往会导致程序挂起)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM