Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.12.05;
Скачать: CL | DM;

Вниз

Отловить событие мыши.   Найти похожие ветки 

 
OlegNik ©   (2009-05-08 10:16) [0]

День добрый.
У меня такой вопрос как отловить событие мыши.
При следующих условиях.
Пользователь дает Panel.Handle и мне необходимо из своей библиотечины запихнуть ему красивый рисунок или еще что.
Как мне отловить событие MouseMove MouseClick?


 
Сергей М. ©   (2009-05-08 10:40) [1]


> запихнуть ему .. еще что


Поколотит он ведь тебя)

А мышь-то причем ? Ты мышь ему запихнуть собрался ?


 
OlegNik ©   (2009-05-08 10:56) [2]

Нет просто пользователь моей библиотеки дает мне панель для выполнения
определенных задач. Где придется вставить пару кнопочек. Которые в свою очередь должны запустить мою задачу. Которая в свою очередь выводит результат расчета на Canvas панельки. Ну а событие мыши на этой панельни мне необходимы для последующих дествий. (кое что перерешать, кое что подтенуть ну чтото в этом духе)


 
Сергей М. ©   (2009-05-08 11:01) [3]

Т.е. хост-приложение, пользующее твою dll, не обязано быть исключительно дельфийским VCL-приложением, так ?


 
OlegNik ©   (2009-05-08 11:15) [4]

Угу.


 
OlegNik ©   (2009-05-08 11:17) [5]

Даже я бы сказал такю На форме пользователя есть местечко которое отдается мне на подзадачу.


 
Сергей М. ©   (2009-05-08 11:30) [6]

Ну тогда ни о каких Canvas и "панельках" не может идти и речи.

Первое, что следует проделать - определить, какому треду хост-процесса принадлежит окно, хэндл которого тобой получен (GetWindowThreadProcessId)

Далее следует установка лок.хука WH_MOUSE на поток-владелец окна (SetWindowsHookEx)


 
OlegNik ©   (2009-05-08 15:16) [7]

Делаю следующим образом
var
FCanvas : TCanvas;
SysHook : HHook = 0;
   
    FHandle := AValue;
    FCanvas.Handle:=GetDC(FHandle);
    GetClientRect(FHandle,FRect);
    FCanvas.Rectangle(0, 0, FRect.Right, FRect.Bottom);
    ....
    ReleaseDC(FCanvas.Handle,FHandle);    
{вроде нормально выводит для Usera}

    но с Hookами похоже не дружу
   
function MouseProc(Code : Integer; wParam : word; lParam : Longint): Longint;
begin
  Result := CallNextHookEx(SysHook, Code, wParam, lParam);
  if Code = MSGF_NEXTWINDOW then begin
       {вроде надо repaint}
  end;
  {так пока примеряюсь к x,y}
  Application.MessageBox(PChar(
                          IntToStr(TCBTCreateWnd(Pointer(lParam)^).lpcs.cy+#13#10
                        +IntToStr(TCBTCreateWnd(Pointer(lParam)^).lpcs.cx)),"",0);

end;

    function SetHook(): Integer;
    begin
     SysHook := SetWindowsHookEx(WH_MOUSE, @MouseProc, HInstance,0);     {самое смешное вылетает так что запускаю Delphi по новой}
    end;

что не так


 
Сергей М. ©   (2009-05-08 16:53) [8]

SysHook := SetWindowsHookEx(WH_MOUSE, @MouseProc, 0, ID_треда_ создавшего_окно_с_переданным_тебе_хэндлом);

..

function MouseProc(Code : Integer; wParam: WPARAM; var lParam: MOUSEHOOKSTRUCT): Longint; stdcall;
begin
 if (Code = HC_ACTION) and (lParam.HWND = переданный тебе хэндл окна) then        
 begin
// нижеследующее мышиное событие
// произошло при нахождении мышиного курсора в точке с абсолютными экранными координатами, значения которых указано в lParam.pt
   case wParam of
     WM_LBUTTONDBLCLK: ...
     WM_LBUTTONDOWN:  ...
     WM_LBUTTONUP:     ...
     WM_MBUTTONDOWN:...
     WM_MBUTTONUP: ...
     WM_RBUTTONDOWN: ...
     WM_RBUTTONUP: ...
     WM_MOUSEWHEEL: ...
     WM_MOUSEMOVE: ...
   end;
 end;
 Result := CallNextHookEx(SysHook, Code, wParam, WPARAM(@lParam);
end;


 
OlegNik ©   (2009-05-12 09:11) [9]

Сергей М. Спасибааа.


 
Григорьев Антон ©   (2009-05-12 11:42) [10]


> Сергей М. ©   (08.05.09 11:30) [6]
> Далее следует установка лок.хука WH_MOUSE на поток-владелец
> окна (SetWindowsHookEx)

По-моему, хук здесь - это излишне. Если можно быть уверенным, что весь интерфейс делается в главной нити (а так в большинстве случаев и бывает), достаточно перехватить оконную процедуру через SetWindowLong. Заодно получим возможность обрабатывать не только события мыши, но и, например, WM_Paint - там же есть задача вывода результата.


 
Сергей М. ©   (2009-05-12 11:49) [11]


> Григорьев Антон ©   (12.05.09 11:42) [10]


> Если можно быть уверенным, что весь интерфейс делается в
> главной нити (а так в большинстве случаев и бывает)


Большинство - это не 100%)


 
Григорьев Антон ©   (2009-05-12 11:51) [12]


> Сергей М. ©   (12.05.09 11:49) [11]

Ну так пусть автор уточнит, попадает его случай в большинство или нет.


 
OlegNik ©   (2009-05-13 10:50) [13]

И еще одни вопрос.(даже два)
Могу ли я добавить в эту панель, cкажим пару (число мне точно не известно) объетов управления. (TButton или TEdit). Родителя мне не определить.
 Вернее можно создать цикл до  HWND1 = 0
  HWND1  := GetParent(HWND);
 но как потом  оформить
   TEdit.Create(TComponent), догадываюсь что функции
  HwndToComponent(h: HWND): TComponent не существует.
Ну и второй вопрос. Как отловить изменение головной формы (где находится панелька), которое
чинит узер (перемещение, сворачиване и т.д.)


 
Григорьев Антон ©   (2009-05-13 11:20) [14]

Есть у TWinControl конструктор CreateParented, который позволяет в качестве родителя указывать любое окно, а не только VCL"ное. Сам я ни разу не использовал его, так что не знаю, как он работает, а проблемы там просматриваются - например, такой родитель не сможет обработать нотификационные сообщения от своих детей по стандартам VCL, т.е. большинство событий работать не будет. Наверное, надо опять перехватытвать обработку сообщений родителем и искать там.



Страницы: 1 вся ветка

Текущий архив: 2010.12.05;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.006 c
15-1283253386
И. Павел
2010-08-31 15:16
2010.12.05
Как узнать, с какими параметрами одна программа запустила другую?


2-1284283391
mfender
2010-09-12 13:23
2010.12.05
Проблема с property в наследнике


15-1282667193
Правильный$Вася
2010-08-24 20:26
2010.12.05
у кого-нибудь открывается?


2-1284398519
_Сергей_
2010-09-13 21:21
2010.12.05
Иероглифы а именах файлов


15-1282908527
dr_creigan
2010-08-27 15:28
2010.12.05
Bluetooth в Ubuntu 10.04