Доброе время суток, хочу сделать следующую программу: чтобы добавила к каждому приложению в системное меню запись, при нажатие которого изменялся стиль окна чтобы устоновливался или снимался флаг "Always on Top". насколько я понимаю, нужно внедряться в каждый процесс в виде dll и сделать: GetSystemMenu( hWnd ) и потом AppendMenu чтобы добавить элемент к списку. Но как получить hWnd процесса в который я внедрился? Всем заранее спасибо!
ну еще есть EnumThreadWindows, только как искать окно если код длл выполняется прежде чем окно создаться ?
Смотрите уважаемые коллеги, я создал dll и записываю в реестр чтобы при старте программы (любой) эта dll грузилась в адресное пространство процесса. То есть сначала происходит запуск DllMain чем точка входа программы, так как программа сама создает окна, во время работы DllMain - нету НИКАКИХ окон (так как они еще не созданы). Решение проблемы сделал хаком - создал поток и начала ждать появление окна, но есть два бага: 1) создается окно и переключаеться на мой поток, поток делает EnumThreadWindows и находит один хендл, но в реальности (в тестовой программе, стандартный проект MS VS с окнами, думаю и в других) - три хендла есть. И что мы имеем: подменил оконную процедуру только для 1 хендла, а должен для 3. 2) при наведение мышки на границу окна (чтобы появился курсор изменение размера) и делается подмена оконной процедуры - программа перестает реагировать на внешний мир. Пробовал делать SuspendThread/ResumeThread - толку мало. Есть какие-то мнение насчет этого?
Я делаю так: Код (Text): OldWindowProc = (WNDPROC)SetWindowLongPtr( hWnd, GWL_WNDPROC, (LONG_PTR)NewProc ); Код (Text): LRESULT CALLBACK NewProc ( IN HWND hWnd, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam ) { return CallWindowProc( OldWindowProc, hWnd, uMsg, wParam, lParam ); } вот при этом зависает программа (не могу двигать ней). Что здесь не так?
AntiB В таблице GUI-калбэков(KernelCallbackTable что юзается из KiUserCallbackDispatcher в юзермоде) заменить соответствующий указатель на свой обработчик(либо указатель на таблицу подменить - это лучше, ибо таблица в секции кода, а указатель на неё в PEB, широко применяемый способ кстати), что вызывается при создании окна, тогда не придётся делать циклы ожидания. Вобщем часто возникающая ошибка - при захвате какоголибо обработчика, после отработки нового следует возвратить управление на предыдущий непосредственно, без использования апи, если новый обработчик не выполнит действия, которые должен выполнить предыдущий обработчик.