C++ C++;winAPI基础-通过windows切换

C++ C++;winAPI基础-通过windows切换,c++,winapi,C++,Winapi,不太清楚该如何解释清楚。基本上,问题是我正在寻找一种方法来更改当前活动窗口(自产定义,希望它足够容易理解)-窗口,其中文本现在直接键入。喔 我allready发现的是help和SetFocus()或SetActiveWindow(),但它并不能解决我的问题(或者,也有可能的是,我只是以错误的方式使用了它) 简单地说: HWND Dest = GetFocus(); ... //Some moving around on the 'alt-tab level' :-| SetFocus(Dest)

不太清楚该如何解释清楚。基本上,问题是我正在寻找一种方法来更改当前活动窗口(自产定义,希望它足够容易理解)-窗口,其中文本现在直接键入。喔

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

简单地说:

HWND Dest = GetFocus();
... //Some moving around on the 'alt-tab level' :-|
SetFocus(Dest); 
不会再次将Dest窗口设置为活动状态。 请原谅这些新手的问题,希望不会占用你太多时间。塔克斯

尝试使用该函数

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

系统限制哪些进程可以设置前台窗口。A. 只有满足以下条件之一时,进程才能设置前景窗口 条件是正确的:

  • 这个过程就是前景过程。该进程由前台进程启动
  • 进程接收到最后一个输入事件
  • 没有前台进程
  • 正在调试前台进程
  • 前景未锁定(请参见LockSetForegroundWindow)
  • 前台锁定超时已过期(请参阅SystemParametersInfo中的SPI_GETFOREGROUNDLOCKTIMEOUT)
  • 没有激活的菜单
应用程序无法在用户关闭窗口时将窗口强制置于前台 正在使用另一个窗口。相反,Windows会在任务栏上闪烁 用于通知用户的窗口的按钮

这意味着,如果您不拥有当前的前台进程(这可能是用户四处搜索时的情况),则无法设置新的前台窗口

有几种黑客(google SetForeGroundIndow,你会发现它们),但它们都是黑客,不是一个好主意-让用户决定前景(正如Raymond Chen在他的博客上解释的那样,黑客经常会导致程序挂起)

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

另一方面,只在调用特定窗口的应用程序同时也是该窗口的所有者时,才会将该窗口置于顶部。(根据文件)

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

您可以尝试的另一个功能是,如果您想激活属于另一个应用程序的窗口,但从下面(直接从文档中)可以看出,这有其问题:

系统限制哪些进程可以设置前台窗口。A. 只有满足以下条件之一时,进程才能设置前景窗口 条件是正确的:

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

您是否尝试过使用
setforegroundindow
函数?您可以调用
setforegroundindow
,但它不起作用。用户可以决定前景中的内容。你的程序没有。将窗口置于顶部不是那么必要,另一个问题是它不允许在那里键入内容。它所使用的上下文非常原始,正如我所写的,所以我不知道它怎么会失败。在使用SetFocus()/SetActiveWindow之后,击键仍然应用于上一个窗口。Thx对你们大家来说太多了。虽然有点老套,但最终还是成功了。GetForeGroundIndow()和SetForeGroundIndow()终于对我起作用了。看来我在理解的层次上错了,只是将当前工作窗口存储在HWND obj中。GetFocus()正常终止,但事实上存储在Dest中的值等于NULL。很明显,SetFocus()失败了。你能告诉我这一点吗?我做错了什么?如果GetFocus()返回NULL,那么正如文档所说:“如果调用线程的消息队列没有与键盘焦点关联的窗口,则返回值为NULL。”这意味着当应用程序没有键盘焦点时,你正在调用GetFocus()。正如David Heffernan在原始帖子的评论中所说,你不能强迫用户在上面安装某个应用程序。