-
Dmitry (21.11.14 08:42) [0]Привет всем!!! подскажите пожалуйста, уже весь инет перерыл, не могу найти ответ!
Мне нужно чтобы при щелчке мышки на любой панели или метке формы - событие WM_LButtonDonw (UP) передавалось главному окну формы (точнее фрейма).
А этого не происходит
Максимум что я нашел это как перетаскивать за любой контрол, но мне не это нужно!!! -
Dmitry (21.11.14 08:45) [1]Компонент ApplicationEvents тоже не подходит т.к. фреймов таких может быть до сотни в приложении. Большой проект в котором события Application уже перехватываются другими более важными формами.
Хотя бы понять почему событие не идет дальше.
Панели и кнопки - самописные компоненты, если надо можно код подкорректировать в нужную сторону.
Но не работает и со стандартными VCL так что дело не в них. -
копай 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 и все заработало. неожиданно... почему непонятно!
Всем спасибо!