Кто нибудь знает как получить доступ к очереди сообщений для конкретного приложения?
Или есть ли какая нибудь возможность перехватить сообщение чужого приложения?
Здравствуйте svaft, 25.04.2001 05:03:06 вы писали:
>Кто нибудь знает как получить доступ к очереди сообщений для конкретного приложения? >Или есть ли какая нибудь возможность перехватить сообщение чужого приложения?
В статьях — Базовые сервисы — хуки. Вроде все неплохо описано. Иного способа не знаю.
Здравствуйте svaft, 25.04.2001 05:03:06 вы писали:
>Кто нибудь знает как получить доступ к очереди сообщений для конкретного приложения? >Или есть ли какая нибудь возможность перехватить сообщение чужого приложения?
В Windows есть механизм перехвата сообщений — Hook'и. Работает это приблизительно так: создается и регистрируется функция перехвата (я её делал в DLL). После этого, пред тем, как сообщение попадёт в очередь сообщений приложения (любого, работающего в системе), система будет вызывать функцию — перехватчик, которая может проанализировать сообщение и много чего с ним сделать.
Посмотри в API'шном help'е функции
SetWindowsHookEx
CallNextHookEx
UnhookWindowsHookEx
Пара подводных камней:
1. Функция — перехватчик работает в адресном пространстве, отличном от адресного пространства приложения, установившего перехват. Поэтому, если есть в DLL с перехватчиком глобальные переменные, то они будут РАЗНЫЕ в приложении, использующем DLL, и в функции перехвата при вызове её при перехвате.
2. DLL с функцией перехвата должна лежать в системном каталоге Windows. (при регистрации система не запоминает расположение файла *DLL. Если DLL не найдена, то перехват не будет работать)
Здравствуйте svaft, вы писали:
S>Кто нибудь знает как получить доступ к очереди сообщений для конкретного приложения? S>Или есть ли какая нибудь возможность перехватить сообщение чужого приложения?
Для перехвата сообщений воспользуйтесь функцией SetWindowsHookEx(), с типом ловушки WH_GETMESSAGE. Я думаю, что MSDN достаточно неплохо освещает использование ловушек, но если нужно, я могу прислать пример
Здравствуйте Riziy, вы писали:
R>2. DLL с функцией перехвата должна лежать в системном каталоге Windows. (при регистрации система не запоминает расположение файла *DLL. Если DLL не найдена, то перехват не будет работать)
Здравствуйте Корнилов Григорий Петрович, вы писали:
КГП>Здравствуйте Riziy, вы писали:
R>>2. DLL с функцией перехвата должна лежать в системном каталоге Windows. (при регистрации система не запоминает расположение файла *DLL. Если DLL не найдена, то перехват не будет работать)
КГП>А это точно ?
Это не совсем так.
Экспериментально было установлено следующее: прехваты игнорировались, пока не были указаны в переменной окружения PATH
путь к DLL с функцией перехвата и пути ко всем DLL, которые используются в DLL с функцией перехвата (неявный link, без вызова LoadLibrary ). Отсюда был сделан вывод, что система должна уметь находить все функции (DLL), которые используются при перехвате (в моём случае это DLL с функцией перехвата и DLL с runtime library Borland C++ 5), то есть эти DLL должны быть либо в системном каталоге, либо в каталоге Windows, либо в каталоге, указанном в PATH.
Прошу учесть, что этим я занимался полтора года тому назад и кое-что подзабыл.
Здравствуйте Riziy, вы писали:
R>Это не совсем так. R>Экспериментально было установлено следующее: прехваты игнорировались, пока не были указаны в переменной окружения PATH R>путь к DLL с функцией перехвата и пути ко всем DLL, которые используются в DLL с функцией перехвата (неявный link, без вызова LoadLibrary ). Отсюда был сделан вывод, что система должна уметь находить все функции (DLL), которые используются при перехвате (в моём случае это DLL с функцией перехвата и DLL с runtime library Borland C++ 5), то есть эти DLL должны быть либо в системном каталоге, либо в каталоге Windows, либо в каталоге, указанном в PATH.
R>Прошу учесть, что этим я занимался полтора года тому назад и кое-что подзабыл.
imho для данного случая dll может лежать и в каталоге приложения, устанавливающего хук (по крайней мере у меня так работало). А по поводу поиска dll, то он осуществляется следующим образом: каталог, содержащий ЕХЕ файл -> текущий каталог процесса -> системный каталог windows -> основной каталог windows -> каталоги прописанные в path.