Поместить приложение на передний план

Я должен вывести окно на передний план, используя его имя, например «изображения». С участием

findWindowW(NULL, stringName)

Я получаю дескриптор процесса (HWND). Затем с

SetForegroundWindow(windowHandle);

Я думаю, что автоматически поместил его на передний план, но мне нужно нажать «Enter». Я что-то не так делаю или есть другой способ? Я также могу использовать PID процесса.
Моя конечная цель - отправить ярлыки, такие как CTRL + V, в процесс после того, как он будет переведен на передний план. Спасибо.


person A. Wolf    schedule 12.09.2016    source источник


Ответы (1)


Из MSDN

Система ограничивает, какие процессы могут устанавливать окно переднего плана. Процесс может установить окно переднего плана, только если выполняется одно из следующих условий:

  • Процесс является процессом переднего плана.
  • Процесс был запущен процессом переднего плана.
  • Процесс получил последнее входное событие.
  • Процесса на переднем плане нет.
  • Процесс отлаживается.
  • Процесс переднего плана не является современным приложением или начальным экраном.
  • Передний план не заблокирован (см. LockSetForegroundWindow).
  • Время ожидания блокировки переднего плана истекло (см. SPI_GETFOREGROUNDLOCKTIMEOUT в SystemParametersInfo).
  • Нет активных меню.

Итак, если ваша программа не соответствует вышеизложенному, вы не можете установить передний план автоматически.

Я думаю, вы можете использовать приведенный ниже код для своего случая, и эта ссылка также может помочь.

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);
   }
}
person hyun    schedule 12.09.2016
comment
Спасибо. Я не пробовал, но, глядя на MSDN, я думаю, что понял. Вот моя интерпретация: сначала оставьте дескриптор окна переднего плана и соответствующего окна; затем с помощью AttachThreadInput() процесс разделяет входной буфер (не очень уверен в этом...), чем я устанавливаю другое окно сверху и разделяю два процесса. ‹br›Я не уверен в этом, если что-то не так, пожалуйста, укажите мне на это, спасибо!! - person A. Wolf; 12.09.2016
comment
Вы почти правы. Используя AttachThreadInput, два разных потока могут совместно использовать свои состояния ввода, такие как клавиатура, мышь и т. д. Ваш дескриптор окна может получить правильное состояние при вызове функции AttatchThreadInput с указанием TRUE для второго параметр. - person hyun; 13.09.2016
comment
В порядке. Я запускаю этот метод с дескриптором окна. AttachThreadInput возвращает значение больше 0, поэтому он делает то, что находится в if (я не знаю, как assert работает только с параметром ..). Что делать, если я хочу отправить комбинацию клавиш на второе окно? Даже без смены фокуса. - person A. Wolf; 13.09.2016