![]() |
|
|
#1
|
|||
|
|||
![]() Добрый день уважаемые форумчане и форумчанки.
Пишу безоконную апи программу, которая должна запоминать выкрутасы мышки(движения в основном) сохранять их в файл, что бы потом другая программа могла их воспроизводить. если интересно зачем нужно, расскажу, но не в этом суть. События мышки ловлю довольно просто, обычным хуком "WH_Mouse_LL", тут всё понятно. позже могу привести код. В оконном не апи приложении всё было легко и для примера все выкрутасы записывались в мемо. проблема оказалась в следующем... если программа делает ещё что либо кроме хуков, то каждый раз она ожидает все остальные задачи, а только потом работает с мышью, в итоге пока она выполняет остальные задачи, мышь не шевелится, решением я считал создание дополнительного потока, но был не прав дополнительный поток включает хук и завершается, а после завершения потока хук естественно не пашет. если в конце потока поставить бесконечный слип, то хук ждет окончания слипа и до тех пор держит мышь застывшей, ну то есть то же самое что и в предыдущий раз, вывод: я дурак, понятное дело что нужен второй поток, но не понятно как сделать так же как делает это оконное приложение, чтобы программа или поток не завершался выполнив все, а просто ждал с моря погоды, помогите с этим или подскажите другое решение, но естественно хук должен быть |
#2
|
||||
|
||||
![]() завершай вызов LowLevelMouseProc callback function как можно быстрее
Пишу программы за еду. __________________ |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
reqyz (12.03.2014)
|
#3
|
||||
|
||||
![]() Цитата:
Код:
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
|
||||
|
||||
![]() Цитата:
Код:
Sleep(250); Пишу программы за еду. __________________ |
#5
|
||||
|
||||
![]() Действительно, появились пропуски, не успевает "выхлоп" ловушки отработать, но возник вопрос - а зачем в этой процедуре что-то тяжёлое выполнять, она ведь для этого не предназначена, чисто вывод, в крайнем случае флажок какойнить изменить или метку подправить, в смысле кесарю кесарево
![]() Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#6
|
||||
|
||||
![]() Цитата:
![]() |
#7
|
|||
|
|||
![]() В итоге что мне делать? без окон не обойтись получается?
|