По просьбам трудящихся опишу процесс поподробнее.
Оговорюсь сразу, что полученный продукт имеет полное право завесить винду, и, кто не закрыл документ MS Office или кто прописал гадость сию в автозагрузку - я не виноват :-)
Безобразие я переписал, т.к. в оригинальном варианте сие предназначалось для конкретной версии 3-х Героев. Много кода надёргал с wasm.ru, в особенности из
http://wasm.ru/article.php?article=apihook_1Как оно работает? Всё просто. приложение prog.exe дёргает функцию set_hook из библиотеки syshook.dll. Это могло быть любое приложение, имеющее очередь обратотки сообщений windows.
Далее, функция set_hook, находящаяся в dll-ке (требование MSDN для системных хуков), ставит хук на WH_CBT. Это мог быть любой другой системный хук. События по данному хуку обрабатываются функцией-заглушкой SysMsgProc. Почему так? А потому что нам нужен не хук - нам нужно подгрузится в адресное пространство всех приложений с окнами, особенно Героев :-)
Можно было прописать эту dll-ку в реестр, чтобы она автоматически ко всем приложениям подсасывалась, однако, я не идеален и, думаю, понаделал кучу ошибок. В-общем, чтобы система не падала, лучше так не делать.
DLL-ка при подгрузке ищет в папке, откуда был запущен процесс, файл syshook.ini. В первой строчке этого файла должно быть регулярное выражение, соответствующее имени запускаемого файла, во второй строчке - через сколько раз вызывать sleep(1) при вызовах IsIconic.
Про механизм внедрения рассказывать тут не буду - читайте статью, там всё понятно.
Если кто скажет, что главная процедура DLL-ки должна была бы и выгрузку корректно обработать, то замечу, что мне хотелось, чтобы программа компилировалась у всех под Delphi 6, а там ошибка в system.pas, которая не позволяет корректно обрабатывать события загрузки/выгрузки. Стек сломали-с.
Итак, как оно работает. В папке с Героями должен лежать syshook.ini (в архиве прилагается пример). Запускаем программу (prog.exe), ждём 3 секунды, она должна что-то написать, затем запускаем героев. Программу не закрываем :-).
P.S.: можно было бы сделать более лёгкое и менее кривое решение - исправить exe-шник Героев, но это уже процесс творческий и индивидуальный для каждой конкретной версии Героев.
P.P.S.: в архиве помимо бинарников приложены исходники, дабы желающие могли компилировать вволю. В Delphi открывать dpr-файлы, я компилировал в Delphi 6, можно открыть и скомпилить в Delphi 7.
Dll-ка и exe-шник компилятся отдельно.
Извините за сумбурное описание и хреновый стиль программирования - мало спал %<