Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> хук для DBLClick 
:(
    Опции темы
Zeleniy
  Дата 24.8.2006, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 22.8.2006

Репутация: нет
Всего: нет



НЕ совсем в моей программе (я ее переделываю) используются всем известные функции MouseDown, MouseUp. в них пользователь ВЫБИРАЕТ объект, находящийся на форме (он выделяется для дальнейшего перемещения и последующей работы с ним или другими объектами). 

Нужно чтобы при DBLCLICK по объекту  smile ...  ну скажем появлялось сообщение "это он".  

Было бы все просто, если бы это был мой проект, но в этой программе ОЧЕНЬ ЗАМОРОЧЕННО происходит выделение(пометка) объектов, поэтому событие на двойное нажатие не происходит! 
MouseDown и MouseUp видят только Shift=[ssLeft] и никак это не изменить (не могу переделать именно кусок с пометкой объектов).  

вот... поэтому единственное решение которое мне приходит в голову, это использывать хук для двойного нажатия, но... поскольку я не сильна в хуках и сообщениях, то подскажите , а еще лучше приведите пример как ПЕРЕХВАТИТЬ DBLCLICK? 

P.S. в инете нашла что-то типа WM_Mouse, WH_MOUSE_LL. честно говоря так и н поянла как этим пользываться.   smile   

  smile 

PM MAIL   Вверх
Alexeis
Дата 24.8.2006, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



См. Hook на мышь в FAQ или в поиске по форуму.
А сообщение завется WM_LBUTTONDBLCLK 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Zeleniy
Дата 24.8.2006, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 22.8.2006

Репутация: нет
Всего: нет



спасибо огромное за  WM_LBUTTONDBLCLK smile 

сейчас все поищю!  
PM MAIL   Вверх
Zeleniy
Дата 24.8.2006, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 22.8.2006

Репутация: нет
Всего: нет



вообщем-то всем спасибо, но для моей прги это не подходит...(((((((((((((  smile 

как ни странно, но это сообщение не работает. вернее в "нормальных, чистых" проектах все работает отлично, а вот в этой проге -никак.

(((((((((((((((((

что делать теперь , прямо даже не знаю 
PM MAIL   Вверх
Alexeis
Дата 24.8.2006, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Цитата(Zeleniy @  24.8.2006,  16:56 Найти цитируемый пост)
"нормальных, чистых" проектах все работает отлично, а вот в этой проге -никак.

Ну телепатов среди нас мало, может стоит выложить код. Хотя бы хука для начала.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
bems
Дата 24.8.2006, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



WM_LBUTTONDBLCLK вообще не приходит если не установлен стиль класса окна CS_DBLCLKS. Эта твоя прога можеь где-нить его снимать


--------------------
Обижено школьников: 8
PM MAIL   Вверх
imcrazzy
Дата 8.12.2008, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 8.12.2008

Репутация: нет
Всего: нет



Вот есть рабочий код, который отлавливает почти все события от мышки, НО как сюда добавить событие Даблклик?
Мой if (EventStrut.message = WM_LBUTTONDBLCLK) then... напрочь игнорируется системой...  smile 


Код

unit Unit1;

 interface

 uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
   Dialogs, AppEvnts, StdCtrls;

 type
   TForm1 = class(TForm)
     ApplicationEvents1: TApplicationEvents;
     Button_StartJour: TButton;
     Button_StopJour: TButton;
     ListBox1: TListBox;
     procedure ApplicationEvents1Message(var Msg: tagMSG;
       var Handled: Boolean);
     procedure Button_StartJourClick(Sender: TObject);
     procedure Button_StopJourClick(Sender: TObject);
     procedure FormClose(Sender: TObject; var Action: TCloseAction);
   private
     { Private declarations }
     FHookStarted : Boolean;
   public
     { Public declarations }
   end;

 var
   Form1: TForm1;


 implementation

 {$R *.dfm}

 var
   JHook: THandle;

 // The JournalRecordProc hook procedure is an application-defined or library-defined callback 
// function used with the SetWindowsHookEx function. 
// The function records messages the system removes from the system message queue. 
// A JournalRecordProc hook procedure does not need to live in a dynamic-link library. 
// A JournalRecordProc hook procedure can live in the application itself. 

// WH_JOURNALPLAYBACK Hook Function 

//Syntax 

// JournalPlaybackProc( 
// nCode: Integer;  {a hook code} 
// wParam: WPARAM;  {this parameter is not used}
// lParam: LPARAM  {a pointer to a TEventMsg structure} 
// ): LRESULT;  {returns a wait time in clock ticks} 


function JournalProc(Code, wParam: Integer; var EventStrut: TEventMsg): Integer; stdcall;
 var
   Char1: PChar;
   s: string;
 begin
   {this is the JournalRecordProc}
   Result := CallNextHookEx(JHook, Code, wParam, Longint(@EventStrut));
   {the CallNextHookEX is not really needed for journal hook since it it not
  really in a hook chain, but it's standard for a Hook}
   if Code < 0 then Exit;

   {you should cancel operation if you get HC_SYSMODALON}
   if Code = HC_SYSMODALON then Exit;
   if Code = HC_ACTION then
   begin
     { 
    The lParam parameter contains a pointer to a TEventMsg 
    structure containing information on
    the message removed from the system message queue. 
    }
     s := '';

     if EventStrut.message = WM_LBUTTONUP then
       s := 'Left Mouse UP at X pos ' +
         IntToStr(EventStrut.paramL) + ' and Y pos ' + IntToStr(EventStrut.paramH);

     if EventStrut.message = WM_LBUTTONDOWN then
       s := 'Left Mouse Down at X pos ' +
         IntToStr(EventStrut.paramL) + ' and Y pos ' + IntToStr(EventStrut.paramH);

     if EventStrut.message = WM_RBUTTONDOWN then
       s := 'Right Mouse Down at X pos ' +
         IntToStr(EventStrut.paramL) + ' and Y pos ' + IntToStr(EventStrut.paramH);

     if (EventStrut.message = WM_RBUTTONUP) then
       s := 'Right Mouse Up at X pos ' +
         IntToStr(EventStrut.paramL) + ' and Y pos ' + IntToStr(EventStrut.paramH);

     if (EventStrut.message = WM_MOUSEWHEEL) then
       s := 'Mouse Wheel at X pos ' +
         IntToStr(EventStrut.paramL) + ' and Y pos ' + IntToStr(EventStrut.paramH);

     if (EventStrut.message = WM_MOUSEMOVE) then
       s := 'Mouse Position at X:' +
         IntToStr(EventStrut.paramL) + ' and Y: ' + IntToStr(EventStrut.paramH);

     // Вот сюда пихал свой код: if (EventStrut.message = WM_LBUTTONDBLCLK) then...    

     if s <> '' then
        Form1.ListBox1.ItemIndex :=  Form1.ListBox1.Items.Add(s);
   end;
 end;

 procedure TForm1.Button_StartJourClick(Sender: TObject);
 begin
   if FHookStarted then
   begin
     ShowMessage('Mouse is already being Journaled, can not restart');
     Exit;
   end;
   JHook := SetWindowsHookEx(WH_JOURNALRECORD+1-1, @JournalProc, hInstance, 0);
   {SetWindowsHookEx starts the Hook}
   if JHook > 0 then
   begin
     FHookStarted := True;
   end
   else
     ShowMessage('No Journal Hook availible');
 end;

 procedure TForm1.Button_StopJourClick(Sender: TObject);
 begin
   FHookStarted := False;
   UnhookWindowsHookEx(JHook);
   JHook := 0;
 end;

 procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
   var Handled: Boolean);
 begin
   {the journal hook is automaticly camceled if the Task manager 
  (Ctrl-Alt-Del) or the Ctrl-Esc keys are pressed, you restart it 
  when the WM_CANCELJOURNAL is sent to the parent window, Application}
   Handled := False;
   if (Msg.message = WM_CANCELJOURNAL) and FHookStarted then
     JHook := SetWindowsHookEx(WH_JOURNALRECORD, @JournalProc, 0, 0);
 end;

 procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
 begin
   {make sure you unhook it if the app closes}
   if FHookStarted then
     UnhookWindowsHookEx(JHook);
 end;

 end.


M
bartram
imcrazzy, не забываем пользоваться кнопочкой Код


Это сообщение отредактировал(а) bartram - 8.12.2008, 20:18
PM MAIL   Вверх
malor
  Дата 30.7.2011, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 632
Регистрация: 17.11.2006

Репутация: нет
Всего: нет



Цитата(bems @  24.8.2006,  28:67 Найти цитируемый пост)
WM_LBUTTONDBLCLK вообще не приходит, если не установлен стиль класса окна CS_DBLCLKS. Эта твоя прога может где-нить его снимать 

Как убрать у окна стиль  CS_DBLCLKS на этапе дизайна? Ну либо программно?

Вот так подойдет -
Код

  handleMainForm := MainForm.Handle;

  SetClassLong(handleMainForm, GCL_STYLE,
    GetClassLong(handleMainForm, GCL_STYLE) and not CS_DBLCLKS);
?

Delphi XE

Это сообщение отредактировал(а) malor - 30.7.2011, 22:44
PM MAIL   Вверх
bems
Дата 31.7.2011, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



для vclных форм правильнее перекрыть метод CreateParams, и установить/убрать что нужно в Params.WindowClass.style


--------------------
Обижено школьников: 8
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1096 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.