Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 1
Регистрация: 18.03.2015
Сообщений: 15

Очередь обработчиков сообщения

18.03.2015, 19:15. Показов 795. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем.
Как в глобальном хуке на WM_MouseWheel узнать, есть ли еще обработчики этого сообщения, кто они (получить указатели) и где находятся (в данном приложении например).

То есть, я устанавливаю хук, обрабатываю его определенным образом, и передаю управление следующему обработчику сообщения через CallNextHookEx(GMouseHookHandle, ACode, WParam, LParam);

А есть ли возможность узнать КТО этот следующий (или кто они если их несколько)?

Это нужно, например, чтобы при скроллировании списка TScrollBox узнать, обрабатывается ли скролл мышки еще кем-то (например, наследником SpinEdit, находящемся внутри списка) и если да - не скроллировать список.

В текущем исполнении же получается что и список скроллируется, и SpinEdit Меняет значение. Что очень неудобно.

Добавлено через 3 часа 13 минут
В общем сделал хук, на WH_GETMESSAGE

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function FrameListGetMsgHookHandler(CODE, WParam, LParam: DWORD): DWORD; stdcall;
var
  _msg:PMsg;
begin
    Result:=CallNextHookEx(GGetMsgHookHandle, CODE, WParam, LParam);
    if CODE=HC_ACTION then
    begin
        _msg:=PMsg(LParam);
        if (_msg^.message=WM_MOUSEWHEEL) then begin
            if (GGetMsgHookMsgDest<>0) then begin
                SendMessage(GGetMsgHookMsgDest, WM_CUSTOM_MOUSE_Wheel2, WParam, LParam);
            end;
        end;
    end;
end;
а в компоненте (указанному GGetMsgHookMsgDest) есть обработчик сообщения WM_CUSTOM_MOUSE_Wheel2
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
WM_CUSTOM_MOUSE_Wheel2: begin
        if (csDesigning in ComponentState) then exit;
 
         msg1:=PMsg(Msg.LParam);
         if msg1.hwnd<>FListPanel.Handle then begin
            if (MouseIn(FListPanel) or MouseIn(Fscroller)) then
            WI.cbSize:=sizeof(tagwindowinfo);
                GetWindowInfo(msg1.hwnd,WI);
                GetClassName(msg1.hwnd, WinClass, SizeOf(WinClass));
                //showmessage(WinClass);
         end;
    end;
Теперь я отлавливаю ВСЕ окна в данном приложении, которые получают сообщение WM_MOUSEWHEEL
Как теперь узнать что они РЕАГИРУЮТ на это сообщение? т.е. что они например что-то делают когда его получают?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.03.2015, 19:15
Ответы с готовыми решениями:

Задача на очередь (вывод сообщения, что очередь пуста)
Доброго дня! Есть задачка на очередь, которая работает нормально, только надо добавить код, чтобы выводил сообщение, что очередь пуста.....

Сформировать односвязную очередь из элементов, которые входят в очередь Q1, но не входят в очередь Q2
Составить программу обработки динамической структуры данных: сформировать односвязную очередь Q из элементов, которые входят в очередь Q1,...

Сформировать очередь по файлу целых чисел. Промоделировать очередь в супермаркете
Сформировать очередь по файлу целых чисел. Промоделировать очередь в супермаркете. В каждый момент времени происходит одно из событий:...

5
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
18.03.2015, 21:15
Цитата Сообщение от gordom Посмотреть сообщение
Как ..узнать что они РЕАГИРУЮТ на это сообщение?
Никак.
0
0 / 0 / 1
Регистрация: 18.03.2015
Сообщений: 15
19.03.2015, 08:23  [ТС]
жаль. что ж делать-то.
Как-то ведь разработчики скроллируемых списков борятся с тем что при скролле списка тоже прокручивается какой-то компонент размещенный в этом списке?
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
19.03.2015, 08:48
Цитата Сообщение от gordom Посмотреть сообщение
и список скроллируется, и SpinEdit Меняет значение
Что мешает перекрыть нежелательное, на твой взгляд, поведение СпинЭдита в подобной ситуации ?
0
0 / 0 / 1
Регистрация: 18.03.2015
Сообщений: 15
19.03.2015, 16:21  [ТС]
оно как раз желательное. это я должен не мешать таким компонентам. т.е. Пользователь если на таком компоненте щелкает, а затем скроллирует - значит делает это сознательно. и в таких случаях я не должен скроллировать панель на которой все это лежит.
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
19.03.2015, 18:49
Что мешает просто написать обработчик колеса для ScrollBox ?
Типа такого:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TForm1.ScrollBox1MouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
  if (ActiveControl = ScrollBox1) or not (PtInRect(ActiveControl.BoundsRect, ActiveControl.Parent.ScreenToClient(MousePos))) then
  begin
    ScrollBox1.VertScrollBar.Position := ScrollBox1.VertScrollBar.Position - WheelDelta div 6;
    Handled := True;
  end else
    if ActiveControl is TSpinEdit then
    begin
      (ActiveControl as TSpinEdit).Value := (ActiveControl as TSpinEdit).Value + WheelDelta div 120;
      Handled := True;
    end;
end;
Ну и например:
Delphi
1
2
3
4
5
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #27 then
    ActiveControl := ScrollBox1;
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.03.2015, 18:49
Помогаю со студенческими работами здесь

Очередь (сделать очередь, чтобы добавляло, удаляло, читало. Не STL.)
Помогите пожалуйста написать очередь. Есть Температура double и ее тип int ну и нужно сделать очередь, чтобы добавляло, удаляло, читало....

Возможно ли смоделировать очередь, где условие входа в очередь задаётся логическим выражением?
Доброго всем дня! Моделирую Lean/Kanban, есть такое требование: пользователь должен иметь возможность менять размер очереди (от этого...

Дана очередь с вещественными числами, упорядоченными по убыванию. Добавить в очередь среднее арифметическое элементов
Дана очередь с вещественными числами, упорядоченными по убыванию. Добавить в очередь среднее арифметическое элементов очереди, не...

Как переделать очередь основанную на массиве в циклическую очередь
Как переделать очередь основанную на массиве в циклическую очередь? Тут кое-какие попытки. Беда с выводом так же присутствует) uses ...

несколько обработчиков
Здравствуйте. Хочу организовать ajax-приложение. Движок сайта написан на php при использовании патерна модель-вид-контроллер. Так как ajax...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru