Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
1 / 1 / 5
Регистрация: 28.03.2013
Сообщений: 299
1

Нужно додумать код CBT хука

25.12.2015, 16:13. Показов 830. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Написал с горем по полам CBTHook(dll) на HCBT_ACTIVATE. Суть этого хука в том что бы перехватить появление определенного окна, и получить его хендл, потом произвести с ним какие то действия.
Код хука:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function CBTHook(Code : Integer; wParam, lParam: DWORD): Longint; stdcall;
var
  h : HWND;
begin 
  if Code >= 0 then
  begin
    case Code of
      HCBT_ACTIVATE:
      begin
          h := FindWindow(nil, 'ScanMaster');
          if h<>0 then
          begin
            SetWindowLong(h, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
          end;
      end;
    end;
    Result := 0;
  end
  else
    Result := CallNextHookEx(HookCBTHandle, Code, wParam, lParam);
end;
 
включить: HookCBTHandle := SetWindowsHookEx(WH_CBT, @CBTHook, hInstance, 0);
Все работает, нужное окно он перехватывает, но когда запущен хук то окна становятся активными со второго клика мышки. Как победить это?

Добавлено через 4 часа 53 минуты
UP!!! Прошу помощи! Если нужно то не бесплатно.

Добавлено через 6 минут
Например открываю notepad, и что бы вписать в него текст то нужно нажать на него не один раз как обычно, а 2 раза.

Добавлено через 1 час 28 минут
Если делаю вот так то все норм. Но так ловятся далеко не все окна программы... хз почему.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function CBTHook(Code : Integer; wParam, lParam: DWORD): Longint; stdcall;
var
  h, h1, h2 : HWND;
  WindowName:array[0..MAX_PATH-1] of char;
begin
  case CODE of
  HCBT_ACTIVATE:
  begin
    GetWindowText(WParam,@WindowName,MAX_PATH);
    if WindowName = 'ScanMaster' then
    begin
      h := FindWindow(nil, 'ScanMaster');
      if h<>0 then
      begin
        SetWindowLong(h, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
      end;
    end;
  end;
  end;
    Result := CallNextHookEx(HookCBTHandle, Code, wParam, lParam);
end;
Добавлено через 2 часа 38 минут
up!!! нифига не получается! прошу помощи!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.12.2015, 16:13
Ответы с готовыми решениями:

нужно додумать до конца дизайн
определенно оранжевый присутствует, далее путаница серебро или продолжать пользователя смотреть на...

Не могу додумать код
Народ,помогите разобраться, не могу додумать код: SetWindowsHookEx(WH_KEYBOARD_LL,(HO...

CBT хук, HCBT_CREATEWND для одного окна выполняется не однократно
Здравствуйте возникла проблема при мониторинге открытия окон. При установке хука CBT и кода...

Вложенные циклы и итерации (нужно что бы последовательностью, нужно код усовершенствовать, ну и сам код проверить )
Дано действительное число х. Последовательность a1, a2, ... образована по следующему закону: type...

5
Пишу на Delphi...иногда
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
25.12.2015, 16:26 2
Цитата Сообщение от EEjester Посмотреть сообщение
нифига не получается! прошу помощи!
что именно не получается?

по коду:
1 для чего искать хендл окна, если он уже есть? (используется в GetWindowText)
2 стоит проверять результат SetWindowLong и не стоит необдуманно удалять имеющиеся стили при установке нового
0
1 / 1 / 5
Регистрация: 28.03.2013
Сообщений: 299
25.12.2015, 16:43  [ТС] 3
Цитата Сообщение от cotseec Посмотреть сообщение
1 для чего искать хендл окна, если он уже есть? (используется в GetWindowText)
Цитата Сообщение от EEjester Посмотреть сообщение
function CBTHook(Code : Integer; wParam, lParam: DWORD): Longint; stdcall;
var
* h, h1, h2 : HWND;
* WindowName:array[0..MAX_PATH-1] of char;
begin
* case CODE of
* HCBT_ACTIVATE:
* begin
* * GetWindowText(WParam,@WindowName,MAX_PATH);
* * if WindowName = 'ScanMaster' then
* * begin
* * * h := FindWindow(nil, 'ScanMaster');
* * * if h<>0 then
* * * begin
* * * * SetWindowLong(h, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
* * * end;
* * end;
* end;
* end;
* * Result := CallNextHookEx(HookCBTHandle, Code, wParam, lParam);
end;
Если ты про этот код то он не ловит те окна что мне нужны. Например дополнительные всплывающие окна он НЕ отлавливает.

Конкретно не получается сделать нормальный хук который бы хукал определенные окна до их появления. Передавал мне хендл этих окно, я производил с ними действие, и только потом окна показывались.
Мой хук не работает корректно. Почему то после того как я его ставлю, у ВСЕХ программ на окна нужно жать два раза что бы оно стало активным.
0
Пишу на Delphi...иногда
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
25.12.2015, 16:53 4
Цитата Сообщение от EEjester Посмотреть сообщение
Например дополнительные всплывающие окна он НЕ отлавливает
конкретно этот код ловит окно с названием ScanMaster а флаг HCBT_ACTIVATE говорит о том, что окно активизируется, т.е. уже было создано, а у всплывающих окон какой заголовок? да и класс тоже стоит смотреть
Цитата Сообщение от EEjester Посмотреть сообщение
окна становятся активными со второго клика мышки
результат работы функции хука необходимо возвращать всегда, также не стоит забывать о коллегах по цепочке хуков, а не только в случае "иначе"
0
1 / 1 / 5
Регистрация: 28.03.2013
Сообщений: 299
25.12.2015, 17:32  [ТС] 5
точно такое же название у всплывающих окон.

Цитата Сообщение от cotseec Посмотреть сообщение
флаг HCBT_ACTIVATE говорит о том, что окно активизируется, т.е. уже было создано
Если я ставлю HCBT_CREATEWND, то он перехватывает окно до его создания. Тогда я не могу даже получить название создающегося окна.

Цитата Сообщение от cotseec Посмотреть сообщение
результат работы функции хука необходимо возвращать всегда
возможно в этом ошибка. как его возвращать?

Добавлено через 28 минут
Господи ну прошу дайте пример кода хука!!! Который будет возвращать хендл созданного окна!!!
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
25.12.2015, 19:59 6
Цитата Сообщение от EEjester Посмотреть сообщение
Если я ставлю HCBT_CREATEWND, то он перехватывает окно до его создания
А какая разница до или после ?

Ты же не уточнил про
Цитата Сообщение от EEjester Посмотреть сообщение
произвести с ним какие то действия.
значит разницы никакой

Цитата Сообщение от EEjester Посмотреть сообщение
не могу даже получить название создающегося окна
Даже если ты его получишь, то не факт что оно будет искомым, хотя через энное время оно им может стать, когда создавшая окно нить вызовет SetWindowText, чтобы изменить имя на нужное (не то что было указано на момент создания)
0
25.12.2015, 19:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.12.2015, 19:59
Помогаю со студенческими работами здесь

Додумать условие
не могу с условием дописать интересует второй рисунок и треугольник расположенный с осью Oy if...

Не могу додумать
Покупатель должен заплатить в кассу S руб. У него имеются 1, 2, 5, 10, 50, 100, 500 руб. Сколько...

Додумать запрос
Всем привет, есть запрос, на удаление дублирующихся записей из таблицы, изначально я этим запросом...

не могу додумать
Получить Массив X={xj}, j=1...m, равный p-ой строке матрицы A={aij} и массив Y={yi}, i=1...n,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru