Получите мигающее окно в delphi (окно, которому нужен фокус, и окна не будут устанавливать его на передний план)

Я искал в Интернете, как включить «автоматическое переключение» или «автоподнятие» окна с мигающей кнопкой на панели задач в Windows 7, и все, что я могу найти, это как отключить это! Мне нужно как раз наоборот, чтобы включить это, поэтому я посмотрел на эти ответы и нашел ключ реестра ForegroundLockTimeout. Я думаю, что по умолчанию установлено значение 200000 мс, поэтому я установил его на 1 мс, но я думаю, что это ни на что не влияет после Windows XP. Я обнаружил, что раньше можно было включить автоматическое переключение в пользовательском интерфейсе Tweak от Microsoft, но на Win 7 тоже не работает.

Я пытался запрограммировать это в Delphi, и я могу установить окно поверх с помощью SetForegroundWindow, но я не могу определить, какие окна требуют внимания - они мигают. Можно даже обнаружить окно переднего плана с помощью GetForegroundWindow, но не окно, которое мигает, поэтому я мог бы установить его сверху.

Итак, мой вопрос: возможно ли в delphi получить окно, которое требует фокусировки в фоновом режиме?


person Gem    schedule 07.01.2015    source источник
comment
Вы имеете в виду уже мигающее окно в вашем процессе или любой запущенный процесс?   -  person Tom Brunberg    schedule 07.01.2015
comment
Я верю, что он ищет способ открыть окно другого процесса, потому что в своем собственном процессе у него не возникнет проблем с поиском правильного окна.   -  person SilverWarior    schedule 08.01.2015
comment
Нет API для запроса того, какое окно мигает на панели задач. Вам, вероятно, придется делать частые снимки экрана самой панели задач и анализировать пиксели ее кнопок, чтобы увидеть, меняют ли они цвета через равные промежутки времени. Вероятно, вам также придется перехватывать SetForegroundWindow() в каждом запущенном процессе, чтобы определить, какие окна пытаются вывести на передний план и терпят неудачу.   -  person Remy Lebeau    schedule 08.01.2015
comment
Чтобы на самом деле вывести окно на передний план, вам нужно разрешение от процесса переднего плана, если ваше приложение еще не запущено на переднем плане. Для этого вам, вероятно, придется внедрить код в процесс переднего плана и заставить его вызывать AllowSetForegroundWindow(), чтобы предоставить разрешение вашему процессу, чтобы он мог затем вызвать SetForegroundWindow().   -  person Remy Lebeau    schedule 08.01.2015
comment
Какую проблему вы пытаетесь решить?   -  person David Heffernan    schedule 08.01.2015
comment
Что ж, я пытаюсь сделать действительно простую вещь: если внешняя программа (окно) требует внимания (мигание на панели задач), то она должна появиться впереди (или получить имя/класс этого окна в коде Delphi, поэтому я могу setforegroundwindow сам). Разве это не должно быть нормальным для включения/отключения в Windows? Я предполагаю, что Microsoft удалила это, отключив ForegroundLockTimeout из-за эксплуатации или чего-то еще.   -  person Gem    schedule 08.01.2015
comment
Перепрошивка выполняется вызовом FlashWindow из FlashWindowEx. Таким образом, вы можете попытаться перехватить эти вызовы в приложениях, которые вы отслеживаете. Но зачем вообще такое поведение? Приложения, которые позволяют своей кнопке задач мигать, делают это преднамеренно, потому что кража фокуса гораздо более навязчива для пользователя.   -  person R. Beiboer    schedule 10.01.2015
comment
Я предполагаю, что эта тема уже отвечает на ваш вопрос. Значит дубликат.   -  person R. Beiboer    schedule 12.01.2015