Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.03.2014, 13:01
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
Стрелка И сново Хуки

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

События мышки ловлю довольно просто, обычным хуком "WH_Mouse_LL", тут всё понятно. позже могу привести код.
В оконном не апи приложении всё было легко и для примера все выкрутасы записывались в мемо. проблема оказалась в следующем...

если программа делает ещё что либо кроме хуков, то каждый раз она ожидает все остальные задачи, а только потом работает с мышью, в итоге пока она выполняет остальные задачи, мышь не шевелится,

решением я считал создание дополнительного потока, но был не прав

дополнительный поток включает хук и завершается, а после завершения потока хук естественно не пашет. если в конце потока поставить бесконечный слип, то хук ждет окончания слипа и до тех пор держит мышь застывшей, ну то есть то же самое что и в предыдущий раз,

вывод: я дурак, понятное дело что нужен второй поток, но не понятно как сделать так же как делает это оконное приложение, чтобы программа или поток не завершался выполнив все, а просто ждал с моря погоды,

помогите с этим или подскажите другое решение, но естественно хук должен быть
Ответить с цитированием
  #2  
Старый 12.03.2014, 13:48
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

завершай вызов LowLevelMouseProc callback function как можно быстрее
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
reqyz (12.03.2014)
  #3  
Старый 12.03.2014, 15:00
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от reqyz
...если программа делает ещё что либо кроме хуков, то каждый раз она ожидает все остальные задачи, а только потом работает с мышью, в итоге пока она выполняет остальные задачи, мышь не шевелится...
Как не пытался засадить "обычного" мышиного перехватчика, в смысле типа
Код:
var
MouseHook: HHOOK;

function LowLevelMouseProc(nCode: Integer;
     WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
var
 s: string;
begin
 Result:= CallNextHookEx(MouseHook, nCode, WParam, LParam);
 case WParam of
   WM_LBUTTONDOWN:   s:= 'LBUTTONDOWN';
   WM_LBUTTONUP:     s:= 'LBUTTONUP';
   WM_LBUTTONDBLCLK: s:= 'LBUTTONDBLCLK';
   WM_RBUTTONDOWN:   s:= 'RBUTTONDOWN';
   WM_RBUTTONUP:     s:='RBUTTONUP';
   WM_RBUTTONDBLCLK: s:= 'RBUTTONDBLCLK';
   WM_MBUTTONDOWN:   s:= 'MBUTTONDOWN';
   WM_MBUTTONUP:     s:= 'MBUTTONUP';
   WM_MBUTTONDBLCLK: s:= 'MBUTTONDBLCLK';
   WM_MOUSEMOVE:     s:= 'MOUSEMOVE';
   WM_MOUSEWHEEL:    s:= 'MOUSEWHEEL';
 end;
 Form1.Memo1.Lines.Add(s + ': ' +
 IntToStr(Mouse.CursorPos.X) + 'X' +
 IntToStr(Mouse.CursorPos.Y));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
MouseHook:= SetWindowsHookEx(WH_MOUSE_LL {14}, @LowLevelMouseProc, HInstance, 0);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin
UnhookWindowsHookEx(MouseHook);
end;
всякой разной программной ерундой, но так этого и не удалось сделать, работает как швецарские ходики, без нареканий
Ответить с цитированием
  #4  
Старый 12.03.2014, 15:26
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
Подмигивание

Цитата:
Сообщение от Alegun
но так этого и не удалось сделать
добавь
Код:
Sleep(250);
после вывода в Memo и будет эффект ТС
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 12.03.2014, 15:42
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Действительно, появились пропуски, не успевает "выхлоп" ловушки отработать, но возник вопрос - а зачем в этой процедуре что-то тяжёлое выполнять, она ведь для этого не предназначена, чисто вывод, в крайнем случае флажок какойнить изменить или метку подправить, в смысле кесарю кесарево
Ответить с цитированием
  #6  
Старый 12.03.2014, 16:23
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Alegun
Действительно, появились пропуски, не успевает "выхлоп" ловушки отработать, но возник вопрос - а зачем в этой процедуре что-то тяжёлое выполнять, она ведь для этого не предназначена, чисто вывод, в крайнем случае флажок какойнить изменить или метку подправить, в смысле кесарю кесарево
Возможно у ТС идёт вывод на медлительное устройство (например на сетевой диск) или слишком много подготовительных операций. Чтобы побыстрее выйти из низкоуровнего callback лучше в нём реализовать например через PostMessage, а в оконной процедуре уже можно обработать результаты в более спокойной обстановке.
Ответить с цитированием
  #7  
Старый 12.03.2014, 20:32
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

В итоге что мне делать? без окон не обойтись получается?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:37.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025