Сама идея, как реализовать хук на чистом бейсике, принадлежит tyomitch-у. В большинстве тем на форуме, посвященных хукам, всплывал его, в общем-то, революционный пример с хуканьем часиков трея - скорее всего, первый пример хука полностью на бейсике.
Итак, чтобы установить хук не на свой поток (не на свою програму), в функцию SetWindowsHookEx нужно передавать адрес процедуры, находящейся в подключаемой библиотеке. И на самом деле, не важно, стандартная ли это библиотека, ActivX.dll или ... Или даже ActivX.ocx ! Главное - чтобы она могла быть загружена в адресное пространство других процессов.
Фишка: процедура хука попадает в адресное пространство чужого процесса ДО загрузки рантайма. Но если в этой процедуре не использовать функций самого бейсика, а АПИ использовать из тлб, то всё замечательно работает! Рантайм, оказывается, можно и не загружать вовсе! Так что я отказался от "поднятия рантайма за шнурки" :)
Выкладываю два примера. Главный - в нём более-менее полноценный контрол. Реализовано три вида хуков. На клавиатуру, на мышь и CTB (это сворачивания-разворачивания-скрытия-показывания-создания-разрушения-таскания-растягивания всяких окон).
Второй пример - предельно упрощённый, из него выброшено всё, оставлен только голый принцип. Это, так сказать, минималка - чтобы легче было разобраться :)
Для примеров нужна win32.tlb (после компиляции - уже не нужна :)
скачать можно, например, отсюда.
Обратите внимание: нельзя передекларировать используемые АПИ, иначе пример не заработает - те АПИ, которые используются в функциях обратного вызова хуков, должны быть объявлены именно через тлб
Прошу высказываться. Ещё - очень прошу, проверьте КАК ЭТО РАБОТАЕТ В ВИСТЕ? Требуются ли какие-нибудь привилегии, чтобы позволили хукать?