Конференция "WinAPI" » WM_LButtonDown не доходит до формы от контролов на ней [D7, WinXP]
 
  • Dmitry (21.11.14 08:42) [0]
    Привет всем!!! подскажите пожалуйста, уже весь инет перерыл, не могу найти ответ!
    Мне нужно чтобы при щелчке мышки на любой панели или метке формы - событие WM_LButtonDonw (UP) передавалось главному окну формы (точнее фрейма).
    А этого не происходит
    Максимум что я нашел это как перетаскивать за любой контрол, но мне не это нужно!!!
  • Dmitry (21.11.14 08:45) [1]
    Компонент ApplicationEvents тоже не подходит т.к. фреймов таких может быть до сотни в приложении. Большой проект в котором события Application уже перехватываются другими более важными формами.
    Хотя бы понять почему событие не идет дальше.
    Панели и кнопки - самописные компоненты, если надо можно код подкорректировать в нужную сторону.
    Но не работает и со стандартными VCL так что дело не в них.
  • han_malign © (21.11.14 08:58) [2]
    копай TCustomForm.KeyPreview
  • Dmitry (21.11.14 10:19) [3]
    у фрейма нет такого свойства...
  • Dmitry (21.11.14 10:52) [4]
    изменение его для родительской формы результата не дает.
  • junglecat © (21.11.14 12:16) [5]
    KeyPreview для мыши разве работает?
    если самописные, то в соотв. обработчиках можно же сделать PostMessage или Perform родителю?
  • Dmitry (21.11.14 13:05) [6]
    Пытаюсь сделать хук.  вот процедура.
    function MouseHookHandler(ACode: integer; WParam: WParam; LParam: LParam): LResult; stdcall;
    begin
       result:=CallNextHookEx(GMouseHookHandle, ACode, WParam, LParam);
       if (ACode>0) then begin
           case wparam of
               WM_LBUTTONDOWN:
               if (GMouseHookMsgDest<>0) then begin
                   PostMessage(GMouseHookMsgDest, WM_CUSTOM_MOUSE_LButtonDown, 0, 0);
               end;
               WM_LBUTTONUP:
               if (GMouseHookMsgDest<>0) then begin
                   //PostMessage(GMouseHookMsgDest, WM_CUSTOM_MOUSE_LButtonUp, 0, 0);
               end;
               WM_MOUSEMOVE:
               if (GMouseHookMsgDest<>0) then begin
                   //PostMessage(GMouseHookMsgDest, WM_CUSTOM_MOUSE_Move, 0, 0);
               end;
           end;
       end;
    end;


    где GMouseHookMsgDest - handle компонента Tscrollbox на котором все фреймы и лежат.
    Наследник этого Tscrollbox наследует процеруру WndProc где обрабатывает пользовательские сообщения типа WM_CUSTOM_MOUSE_LButtonDown = wm_user+1098
    Выглядит эта процедура так

    procedure TFtFrameListBox.WndProc(var Msg: TMessage);
    var CurrentPoint:TPoint;
    begin      
       case Msg.Msg of
       WM_CUSTOM_MOUSE_LButtonDown: begin
       end;
       WM_CUSTOM_MOUSE_LButtonUp: begin
       end;
       WM_CUSTOM_MOUSE_Move: begin
       end;
       else begin
           inherited WndProc(Msg);
       end;
       end;
    end;



    Проблема в том что даже в таком упрощенном виде она зависаеет!!!
  • Dmitry (21.11.14 13:07) [7]
    то есть хук работает. видит что нажата кнопка мыши, например. Отправляет скроллбоксу (через указатель) PostMessage с пользовательским событием.
    А конная процедура Скроллбокса виснет!!!
  • Dmitry (21.11.14 13:26) [8]
    Странно. если ставить брейкпоинт на PostMessage(GMouseHookMsgDest, WM_CUSTOM_MOUSE_LButtonDown, 0, 0); то он срабатывает.
    но само окно как будто зависшее. где-то не добавил передачу события наследникам, а где не вижу.
  • Dmitry (21.11.14 13:26) [9]
    то есть родителям.
  • Dmitry (21.11.14 13:36) [10]
    Заменил везде PostMessage на SendMessage и все заработало. неожиданно... почему непонятно!

    Всем спасибо!
 
Конференция "WinAPI" » WM_LButtonDown не доходит до формы от контролов на ней [D7, WinXP]
Есть новые Нет новых   [134427   +34][b:0][p:0.002]