将应用程序放到前台

时间:2016-09-12 13:51:22

标签: windows c++11 process foreground

我必须使用其名称将窗口置于前景,例如“images”。 与

findWindowW(NULL, stringName)

我得到了流程的句柄(HWND)。 然后用

SetForegroundWindow(windowHandle);

我认为我自动将它放到前台,但我必须按'Enter'。我做错了什么还是有另一种方法可以做到这一点?我也可以使用过程的PID。
我的最终目的是在将它放到前台后将CTRL + V等快捷方式发送到进程。谢谢。

1 个答案:

答案 0 :(得分:2)

来自MSDN

  

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

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

因此,如果您的程序与上述程序不符,则无法自动设置前景。

我认为您可以使用以下代码来处理您的案例,此link也可以提供帮助。

void SetForegroundWindowForce(HWND hWnd)
{
   HWND hWndForeground = ::GetForegroundWindow();
   if(hWndForeground == hWnd) return;

   DWORD Strange = ::GetWindowThreadProcessId(hWndForeground, NULL);
   DWORD My = ::GetWindowThreadProcessId(hWnd, NULL);
   if( !::AttachThreadInput(My, Strange, TRUE) )
   {
      ASSERT(0);
   }
   ::SetForegroundWindow(hWnd);
   ::BringWindowToTop(hWnd);
   if( !::AttachThreadInput(My, Strange, FALSE) )
   {
      ASSERT(0);
   }
}