Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2010.12.05;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2010.12.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.003 c
15-1282887776
менеджер какого-то звена
2010-08-27 09:42
2010.12.05
Ёксель


2-1284475363
Aleks
2010-09-14 18:42
2010.12.05
Привязка проги к винту


15-1282842079
alien1769
2010-08-26 21:01
2010.12.05
Радостное событие


4-1242124565
Zalum
2009-05-12 14:36
2010.12.05
передать и принять несколько параметров


15-1282728977
Baks
2010-08-25 13:36
2010.12.05
Хостинг Agava.ru vs NTHost.ru





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский