2016-09-12 6 views
0

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

findWindowW(NULL, stringName) 

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

SetForegroundWindow(windowHandle); 

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

ответ

1

Из MSDN

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

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

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

Я думаю, вы можете использовать нижеследующий код для своего дела, и это может быть полезно и для 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); 
    } 
} 
+0

спасибо. Я не пробовал, но, глядя на MSDN, я думаю, что понял. Вот моя интерпретация: сначала держите дескриптор в окне переднего плана и в окне corrent; то с AttachThreadInput() процесс совместно использует входной буфер (не так уверен в этом ...), чем я установил другое окно сверху и «разделил» два процесса.
Я не настолько уверен в этом, если что-то совершенно не так, пожалуйста, укажите его мне, спасибо! –

+0

Ты почти прав. Используя 'AttachThreadInput', два разных потока могут делиться своими входными состояниями, такими как клавиатура, мышь и т. Д. Ваш дескриптор окна может получить ** правильное условие ** как вызов функции« AttatchThreadInput »с указанием ** TRUE ** для второго параметра. – hyun

+0

Хорошо. Я запускаю этот метод с помощью дескриптора окна. AttachThreadInput возвращает значение больше 0, поэтому он делает то, что находится в if (я не знаю, как assert работает только с параметром ..). Что делать, если я хочу отправить комбинацию клавиш во второе окно? Даже без изменения фокус. –

Смежные вопросы