Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2014, 05:50   #1
Endifier
Пользователь
 
Регистрация: 17.06.2014
Сообщений: 36
Вопрос CBTProc

Привет. Ребята, такой вопрос. Хочу перехватить создание окна, да бы задать свои параметры (имя\класс).
Вот код функции:
Код:
function WNDHook(Code : Integer; wParam : NativeUInt; lParam : NativeInt) : NativeInt; stdcall;
begin
  if Code = HCBT_CREATEWND then
  begin
    CREATESTRUCT(Pointer(lParam)^).lpszName := PChar('Test');
    Result := CallNextHookEx(mHook, Code, wParam, lParam);
  end else
      begin
        Result := CallNextHookEx(mHook, Code, wParam, lParam);
      end;
end;
Функция в библиотеке.
Подскажите, в чем моя проблема, или как правильно осуществить задуманное?
Endifier вне форума Ответить с цитированием
Старый 11.10.2014, 07:25   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

А куда указывает Pointer(lParam)? На сруктуру CREATESTRUCT создающегося ЧУЖОГО окна, штоли? Тогда какого Х эта структура находится в памяти ТВОЕГО процесса?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 11.10.2014, 15:18   #3
Endifier
Пользователь
 
Регистрация: 17.06.2014
Сообщений: 36
По умолчанию

Не ясно, запилил библиотеку, все как положено, активирую хук, при создании окна, а именно при перехвате, делал отсылку значений cx, cy, x, y, структуры CREATESCRUCT в свою программу, получал неведомые значения. Вот я и говорю, в чем проблема?
Endifier вне форума Ответить с цитированием
Старый 11.10.2014, 15:42   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

имхо, указатель будет на копию данных структуры, и изменение этих данных на оригинал, находящийся в контексте другого процесса, никак не повлияет, ибо это копия данных.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 11.10.2014, 16:00   #5
Endifier
Пользователь
 
Регистрация: 17.06.2014
Сообщений: 36
По умолчанию

И каким образом осуществить задуманное?
Endifier вне форума Ответить с цитированием
Старый 11.10.2014, 16:24   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
И каким образом осуществить задуманное?
а чо ты задумал? и главное - зачем?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 11.10.2014, 16:26   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

min@y™, бред пишите.

Согласно докам по указателю в LParam лежит CBT_CREATEWND у которой параметр lpcs, указывает на CREATESTRUCT окна, чье создание перехвачено хуком.

Никаких копий чего-то куда-то не надо, все прозрачно делается операционной системой. Тебе сиди да меняй параметры создаваемого окна.

Код:
CREATESTRUCT(Pointer((CBT_CREATEWND(Pointer(lParam)^).lpcs)^):= PChar('Test');
Типа того.

Последний раз редактировалось Человек_Борща; 11.10.2014 в 16:29.
Человек_Борща вне форума Ответить с цитированием
Старый 11.10.2014, 16:30   #8
Endifier
Пользователь
 
Регистрация: 17.06.2014
Сообщений: 36
По умолчанию

В первом сообщении темы, написано, что я задумал. Привел код функции, но у меня не работает, точнее работает, но некорректно, поэтому и обратился за помощью.
Endifier вне форума Ответить с цитированием
Старый 11.10.2014, 16:46   #9
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
min@y™, бред пишите.
Это приказ?
Цитата:
Согласно докам по указателю в LParam лежит CBT_CREATEWND у которой параметр lpcs, указывает на CREATESTRUCT окна, чье создание перехвачено хуком.
доку покурил, согласен. Только указатель указывает на чью память? На память программы, создающей окно, или на память процесса, поставившего хук?
Цитата:
В первом сообщении темы, написано, что я задумал.
Что за прога и зачем это надо - не сказал.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 11.10.2014, 16:53   #10
Endifier
Пользователь
 
Регистрация: 17.06.2014
Сообщений: 36
По умолчанию

Что бы изменить параметры lpszClass\lpszName.
Попробовал так:
Код:
CREATESTRUCT(Pointer(CBT_CREATEWND(Pointer(lParam)^).lpcs)^).lpszName := PChar('Test');
Не хочет.
Endifier вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц