2013-05-14 3 views
1

Мне нужно написать приложение A, которое перехватывает сообщение WM_ACTIVATE в окно приложения B, чтобы предотвратить попадание B в самое верхнее приложение.Возможно ли предотвратить включение приложения (перенесенного на передний план) без использования DLL-инъекции?

Возможно ли это сделать без DLL-инъекция (добавить к ней сообщение, обработать и «нейтрализовать» его серией вызовов WinAPI)?

+1

Ну, вы можете взломать его, если это приемлемое решение. Замените значение WM_ACTIVATE некоторым WM_USER + чем-то. – user1764961

+0

@ user1764961 Спасибо. Какие функции я могу использовать для замены? –

+1

Это какая-то форма гонки вооружений? Будет ли приложение B обновляться, чтобы обнаружить приложение A и остановить его от выполнения перехвата? –

ответ

2

Я думаю, что это то, что вы после:

LockSetForegroundWindow

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633532(v=vs.85).aspx

Замечания система автоматически включает вызовы SetForegroundWindow, если пользователь нажимает клавишу ALT или принимает какое-то действие, которое вызывает самой системы, чтобы изменить окно переднего плана (например, щелкнув фоновое окно). Эта функция предоставляется, поэтому приложения могут помешать другим приложениям сделать предварительное изменение, которое может прервать его взаимодействие с пользователем.

Только не забудьте разблокировать :)

Edit:

Попробуйте SetWinEventHook, как описано здесь:

Is there Windows system event on active window changed?

Затем, когда нежелательное окно приходит на фронт вы можете отправить это на заднем плане.

+0

Я пробовал, но, к сожалению, он не работает (когда я запускаю консольное приложение X, которое вызывает «LockSetForegroundWindow», а затем запускает программу Windows Forms, последнее приложение получает самое верхнее окно). –

+0

Обновлено мой ответ – paulm

+0

Спасибо. Ваше первое решение работает, если я выполняю 'AllowSetForegroundWindow' перед вызовом' LockSetForegroundWindow (1) '. –