Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SetHook и Win2000

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

RoRo



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Говорят, что в Win2000 ф-ия SetWindowsHookEx и все с ней связанные не позволяют перехватывать сообщения для всей системы (тобишь глобальные), а лишь для того процесса, кто загружал эту dll.
Так ли это?
 
Мне удалось сделать HOOK только для WH_KEYBOARD_LL, а хотелось бы для
WH_GETMESSAGE, что по какимто причинам не удается. Можно конечно получить список всех нитей и процессов, и подрубится к ним непосредственно, но это медленно и к томуже проблемы с новыми запущенными программами.
У меня сложилось впечетление, что SetWindowsHookEx не отображает dll, где все это находится, в чужие нити.
 
Пытался ли кто нибудь сделать это под Win2000 и как результаты?

Всего записей: 170 | Зарегистр. 03-01-2002 | Отправлено: 03:00 25-08-2002
mas



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RoRo
 
Бред, конечно, все не так. Иначе какой вообще смысл этой функции.
Все нормально работает.
Код в студию, иначе это обсуждение ни о чем будет.

Всего записей: 206 | Зарегистр. 08-03-2002 | Отправлено: 03:17 25-08-2002
RoRo



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Это компилировалось в CBuilder 6.0
Содержимое dll
 

//------------------------------------------------------------------------------
#include <windows.h>
#include "HookDump.h"
#pragma hdrstop
 
HHOOK hHook;
HANDLE hFile;
 
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        return 1;
}
 
LRESULT CALLBACK My_GetMessage( int nCode, WPARAM wParam, LPARAM lParam )
{
   int LengthWindowText=0;
   unsigned long LengthWrite;
   char WindowText[256];
   HWND WindowHWND=0;
 
if(nCode < 0) return CallNextHookEx( hHook, nCode, wParam, lParam );
if(nCode == HC_ACTION)
   {
     WindowHWND = GetFocus();
     LengthWindowText = GetWindowTextLength(WindowHWND);
     GetWindowText(WindowHWND,WindowText,256);
     WriteFile(hFile,WindowText,10,&LengthWrite,NULL);
        }
   }
   return CallNextHookEx( hHook, nCode, wParam, lParam );
}
 
 
// Процедура установки ловушки
void SetHook(HINSTANCE dll)
{
 if (hHook == NULL){
   hFile = CreateFile("hook1.txt", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
   int q = GetLastError();
   hHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)My_GetMessage,dll, 0);
   if (!hHook)
     {
      MessageBox(0,"Ошибка в SetHook -> SetWindowsHookEx.","Error", MB_OK);
      return;
     }
 }
}
 
// Процедура удаления ловушки
void RemoveHook(void)
{
 CloseHandle(hFile);
 UnhookWindowsHookEx(hHook);
}
//-----------------------------------------------------------------------------
 
Код exe, который вызывает dll фрагмент
 
//----------------------------------------------------------------------------
.
.
.
dll = LoadLibrary("HookDump.dll");
 
if (dll)
 {
  SetHookDLL = (HookSet*) GetProcAddress(dll,"_SetHook");
  if (SetHookDLL)  SetHookDLL(dll);
      else  ShowMessage(GetLastError());
 
  RemoveHookDLL = (Hook*) GetProcAddress(dll,"_RemoveHook");
  if (!RemoveHookDLL) ShowMessage(GetLastError());
 }
 else
 {
  ShowMessage(GetLastError());
  ShowMessage("Модуль DLL не загружен DLL");
 }


Всего записей: 170 | Зарегистр. 03-01-2002 | Отправлено: 04:11 25-08-2002 | Исправлено: RoRo, 14:13 29-08-2002
mas



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RoRo
 
В коде длл никаких серьезных ошибок нет, я, правда, использую GetActiveWindow для получения хендла окна. Проверяй под отладчиком вызывающий код, я на С не пишу, может там где ошибка. Если интересно, могу код на ассемблере выложить, который точно работает

Всего записей: 206 | Зарегистр. 08-03-2002 | Отправлено: 09:20 25-08-2002
RoRo



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mas
 

Цитата:
В коде длл никаких серьезных ошибок нет,

А какие не серьезные?
 
 

Цитата:
я, правда, использую GetActiveWindow для получения хендла окна.

В том то и дело, что до GetFocus(); дело вообще не доходит.
Точнее тело ф-ии My_GetMessage выполняется только если событие приходит в окно того exe, откуда я вызывал SetHookDLL(Dll), и в этом случае код работает на все 100%. Но, что делать? чтобы перехватить сообщения во всех внешних по отнашению к моему exe программах?
 
Вообще то я не откажусь от исходников на ассемблере, если ты гонял свою прогу под Win2000 и она работала.
 
Если не сложно можешь скинуть исходники сюда rodion_killer@email.ru    ?
 
А вообще, может кто сталкивался с проблемой реализации под Win2000 ловушек и знает, где здесь подводные камни?
 

Всего записей: 170 | Зарегистр. 03-01-2002 | Отправлено: 14:22 25-08-2002 | Исправлено: RoRo, 14:28 25-08-2002
mas



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RoRo
 

Цитата:
А какие не серьезные?

Ну, например, нет проверки на повторение символа, по несколько лишних раз срабатывать будет. Вышлю мылом.

Всего записей: 206 | Зарегистр. 08-03-2002 | Отправлено: 16:08 25-08-2002
RoRo



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mas
 
 
Цитата:
Вышлю мылом.

Во-первых, спасибо за исходник.
 

Цитата:
Ну, например, нет проверки на повторение символа, по несколько лишних раз срабатывать будет.

Во-вторых, у меня это тестовый вариант, по этому он и нечего не проверяет.
 
Далее хотелось бы знать mas, где ты все таки тестировал свою прогу в какой OS какая версия и какие там стояли сервис паки? Т.к  твоя прога по большему счету от моей мало чем отличается. Я ее скомпилировал MASM32, запустил и проверил под Windows 2000 pro SP2. Результат работы твоей проги такой же, как и у меня, а именно см. выше.
 
При этом другая программа перехвата сообщений, а именно WinSight32 прекрасно перехватывает все сообщения во всех окнах в этой системе.  Функция SetWindowsHookEx в этой программе располагается в файле wsihk32.dll. И самое интересное, установка Hook происходит там по какой-то более сложной схеме. Перед вызовом SetWindowsHookEx, эта программа производит какие-то хитрые манипуляции с Mutex, Atoms и еще бог знает с чем. А результат эта программа работает, а моя нет.
 
 
Господа, где тут собака зарыта? Кто знает решение этой проблемы, откликнитесь?

Всего записей: 170 | Зарегистр. 03-01-2002 | Отправлено: 14:05 29-08-2002
mas



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RoRo
 
я же тебе не полностью все исходники выслал - а только необходимое. Вышли или выложи полный твой вариант.
Компилировал и работает все это под Вин2к 2-й и затем 3-й сервис пак. У меня все работает

Всего записей: 206 | Зарегистр. 08-03-2002 | Отправлено: 15:45 29-08-2002
RoRo



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mas

Цитата:
я же тебе не полностью все исходники выслал - а только необходимое.  

Необходимые для чего? Они не работают в том варианте, что ты дал.
 
Однако час назад, я нашел решение для своего Варианта. А за одно и для твоего mas.  
И насколько я понял, та dll, исходник которой ты мне прислал, все сообщения перехватывать точно не будет. Т.к. после вызова SetWindowsHookEx эта dll отобразится во все существующие процессы, но с независимыми сегментами данных, иными словами значение hHook во всех процессах кроме создавшего dll будет 0. Отсюда мораль, для всех копий dll нужно предоставит общую память. Это можно сделать созданием дополнительного сегмента с атрибутом SHARED, либо использовав механизм отображения файлов в память.  
И мне  в общем то не понятно mas, как без этих механизмов можно заставить dll перехватывать все сообщения системы.
 
Если нужно могу сказать, как я все это сделал.

Всего записей: 170 | Зарегистр. 03-01-2002 | Отправлено: 19:36 29-08-2002
mas



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Необходимые для чего? Они не работают в том варианте, что ты дал.

 
для понимания.
линкеру указывай
/SECTION:.bss,S
вот и будет SHARED.
 

Цитата:
Если нужно могу сказать, как я все это сделал.

Да у меня и так все работает, как часы

Всего записей: 206 | Зарегистр. 08-03-2002 | Отправлено: 12:07 03-09-2002
RoRo



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mas
 
/SECTION:.bss,S  
Это не сработает в CBuilder 6.0, где я сначало собирал DLL. Так как он все сует в .data , а ее сделать SHARED не удается. Ну короче, теперь это уже не важно. Теперь у меня такие же
Цитата:
часы
.
 
P.S.

Цитата:
для понимания.  


Вот. Вот. Я понял, что лутше использовать MASM
 

Всего записей: 170 | Зарегистр. 03-01-2002 | Отправлено: 00:01 04-09-2002 | Исправлено: RoRo, 09:56 05-09-2002
QuickeneR

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Замечу, что в VC для этого есть

Код:
 
#pragma data_seg(".shared")
HHOOK hHook;
................................
#pragma data_seg()
#pragma comment(linker, "/SECTION:.shared,RWS")
 

Всего записей: 1388 | Зарегистр. 02-02-2002 | Отправлено: 00:17 05-09-2002
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SetHook и Win2000


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru