До Vista одним из способов было бы использовать SetWindowsHookEx
, перехватить WH_CBT
или WH_CALLWNDPROC
ловушку, а затем предпринять соответствующие действия при обнаружении изменения Z-порядка. Однако это не работает с Vista (насколько я могу судить по поиску в Google).
Единственное другое решение, которое я могу придумать, - настроить таймер на срабатывание каждые несколько секунд, а затем, когда вы получаете WM_TIMER
, вы запрашиваете систему, используя GetNextWindow
, чтобы выяснить, какое окно находится за вашим. Если это не IE, тогда вызовите SetWindowPos
, чтобы расположить ваше окно над IE (я предполагаю, что у вас есть HWND
для окна IE, которое вас волнует - помните, что может быть несколько окон IE).
Это вызовет проблемы, если люди попытаются вывести ваше окно на передний план - оно снова станет чуть выше IE. В этом случае в вашем коде вы можете обработать WM_ACTIVATE
и попытаться изменить Z-порядок окна IE, чтобы он находился ниже вашего окна (вызовите SetWindowPos
, чтобы переместить окно IE, чтобы оно находилось над окном, которое в данный момент находится под вашим окном) , Это решение может быть сопряжено с проблемами, поскольку Windows может попытаться предотвратить возникновение проблем с окнами другого процесса по соображениям безопасности. С другой стороны, документы MSDN для SetWindowPos
явно не не упоминают, что вы не можете манипулировать окнами другого процесса. Там могут быть неясные ограничения, хотя.
Даже с таким взломом таймера в вашем приложении будет эффективно работать цикл ожидания занятости (с частыми сообщениями WM_TIMER), и это, как правило, плохо , что нужно сделать, особенно для батареи срок службы ноутбуков и т. д. (поскольку вы не позволяете процессору переходить в состояние сна и т. д.).
Я бы сказал, что нет хорошего способа сделать это, и все, что вы, вероятно, получите, будет хрупким и вызовет проблемы. Я настоятельно рекомендую не пытаться это сделать. Можно ли вместо этого превратить вашу программу в некий плагин или панель инструментов для IE?
NB Обратите особое внимание, что SetWindowsHookEx
налагает штраф на производительность на уровне всей системы, если вы идете по этому маршруту.