Вывод окна на передний план в C # с использованием Win32 API

StackOverflow https://stackoverflow.com/questions/2987

  •  08-06-2019
  •  | 
  •  

Вопрос

Я пишу приложение, которому необходимо вывести окно внешнего приложения на передний план и не обязательно красть фокус (есть настройка, которую пользователь может переключить на кражу / не красть фокус).

Каков наилучший способ сделать это с помощью win32 API?Я пробовал setForeground(), но он всегда крадет фокус и работает нерегулярно.

Каков наилучший способ сделать это?Есть какие-нибудь мысли?

Это было полезно?

Решение

Предполагается, что SetForegroundWindow крадет фокус, и есть определенные случаи, когда это приведет к сбою.

Функция SetForegroundWindow выводит поток, создавший указанное окно, на передний план и активирует окно.Ввод с клавиатуры осуществляется в окне

Попробуйте зафиксировать фокус с помощью Набор для захвата перед тем, как сделать звонок.Также рассмотрите различные способы вывода окна вперед:SetForegroundWindow, SetActiveWindow, даже имитируя щелчок мыши, можно это сделать.

Другие советы

В чем разница между SetForegroundWindow, SetActiveWindow и BringWindowToTop?Кажется, что все они делают одно и то же.

Согласно MSDN, SetForegroundWindow активирует окно и направит фокус клавиатуры на него.Это пытается работать, даже когда ваш процесс находится в фоновом режиме.SetActiveWindow выполняет то же самое, что и SetForegroundWindow, но это ничего не делает, если ваше приложение не является самым передним приложением.Наконец, BringWindowToTop только выводит окно наверх и не изменяет фокус клавиатуры.

Вы можете попробовать функцию BringWindowToTop, чтобы не красть фокус.Я им не пользовался, но, похоже, это то, что вы ищете.

Вы пробовали использовать SetWindowPos?Это каноническая функция для перемещения, изменения размера и установки z-порядка в Windows.Существует флаг SWP_NOACTIVATE, который вы можете использовать.Посмотрите на http://msdn.microsoft.com/en-us/library/ms633545 (ПРОТИВ 85).aspx.Я не пробовал это в окне, принадлежащем другому процессу, но, вероятно, попробовать стоит.

SetWindowPos + SWP_NOACTIVATE выполняет эту работу.

Вы могли бы использовать FindWindow, чтобы получить HWND окна, затем использовать функцию BringWindowToTop, найденную в Win32 API.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top