Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.08.2015, 14:30   #1
vers0
Пользователь
 
Регистрация: 30.11.2011
Сообщений: 18
Вопрос Остановка выполнения при отжатии кнопки мыши.

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


Код:
procedure TForm1.WndProc(var Msg: TMessage);
begin
  inherited;
  if (Msg.Msg = MWM_LBUTTONDOWN) then
  begin
...
if (sRadioGroup1.ItemIndex=0) and (sComboBox1.ItemIndex=4) then
        begin
        GetCursorPos(p);
        SetCursorPos(p.X-4, p.Y+3);
        Sleep(85);
... и т.д. (смещение курсора)
end;
if (Msg.Msg = MWM_LBUTTONUP) then
  begin
    Exit; 
  end;
end;

procedure TForm1.sButton1Click(Sender: TObject);
begin
  if StartMouseHook(True, Handle) = True then
    begin
    HookEnable := True;
    sButton1.Enabled := False;
    sButton2.Enabled := True;
    end else
end;

procedure TForm1.sButton2Click(Sender: TObject);
begin
  if StopMouseHook = True then
    begin
    HookEnable := False;
    sButton2.Enabled := False;
    sButton1.Enabled := True;
    end else
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  UnregisterHotkey(Handle, ID1);
  GlobalDeleteAtom(ID1);
  UnregisterHotkey(Handle, ID2);
  GlobalDeleteAtom(ID2);
  if HookEnable <> False then
    StopMouseHook;

end;

initialization
  MWM_LBUTTONDOWN := RegisterWindowMessage('MWM_LBUTTONDOWN');
  MWM_LBUTTONUP := RegisterWindowMessage('MWM_LBUTTONUP');
end.
vers0 вне форума Ответить с цитированием
Старый 08.08.2015, 16:55   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Все верно. На то он и хук. Клики по клавишам конвертируются в сообщения. А хуки - это программы, которые по очереди эти сообщения обрабатывают. По очереди!
Поэтому пока первое сообщение не будет хуком обработано - второе может и не наступить. Вернее оно то наступит, но винда о нем своим программам не сообщит.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.08.2015, 18:42   #3
vers0
Пользователь
 
Регистрация: 30.11.2011
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Все верно. На то он и хук. Клики по клавишам конвертируются в сообщения.
И как с этим бороться? Вернее что предпринять-то, для достижения задуманного?
vers0 вне форума Ответить с цитированием
Старый 08.08.2015, 18:59   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Эт я тебе не скажу... Я хуки не использую, и другим не советую.
По крайней мере не помешало бы услышать твою задачу. Зачем тебе понадобились хуки. Может тогда чего и посоветовать можно было бы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.08.2015, 23:52   #5
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от vers0 Посмотреть сообщение
глобальный хук через DLL
Можно и без DLL это сделать:

Код:
#define WM_MOUSEWHEEL 0x020A
#define WM_MOUSEHWHEEL 0x020E

HHOOK MouseHook=0;

LRESULT CALLBACK MainMouseProc(int code, WPARAM wParam, LPARAM lParam)
{
        if (code>=0){
        tagMSLLHOOKSTRUCT* mhs = (tagMSLLHOOKSTRUCT*)lParam;

        switch(wParam){
                case WM_LBUTTONDOWN:
                Form1->Memo1->Lines->Add("WM_LBUTTONDOWN");
                break;

                case WM_LBUTTONUP:
                Form1->Memo1->Lines->Add("WM_LBUTTONUP");
                break;

                case WM_MOUSEMOVE:
                Form1->Memo1->Lines->Add("WM_MOUSEMOVE");
                break;

                case WM_MOUSEWHEEL:
                Form1->Memo1->Lines->Add("WM_MOUSEWHEEL");
                break;

                case WM_MOUSEHWHEEL:
                Form1->Memo1->Lines->Add("WM_MOUSEHWHEEL");
                break;

                case WM_RBUTTONDOWN:
                Form1->Memo1->Lines->Add("WM_RBUTTONDOWN");
                break;

                case WM_RBUTTONUP:
                Form1->Memo1->Lines->Add("WM_RBUTTONUP");
                break;
        }
  }
  return CallNextHookEx(MouseHook, code, wParam, lParam);
}

void SetHook(){
        if(!MouseHook) MouseHook = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)MainMouseProc,  GetModuleHandle(0),0);
        if(!MouseHook) MessageBoxA(0,"Ошибка установки хука","Ошибка",0);
}
void DelHook(){
        if(MouseHook){
                UnhookWindowsHookEx(MouseHook);
                MouseHook=0;
        }
}
Цитата:
Сообщение от vers0 Посмотреть сообщение
Есть код, который выполняется при нажатии левой кнопки мыши, а при отжатии этой кнопки должно происходить прекращение выполнения.
Для этого нужно запускать выполнение Вашего кода не в функции обработки сообщений, а в новом потоке, который должен создаваться при нажатии кнопки и убиваться при отжатии кнопки.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).

Последний раз редактировалось Krasiosoft; 09.08.2015 в 00:02.
Krasiosoft вне форума Ответить с цитированием
Старый 09.08.2015, 10:01   #6
vers0
Пользователь
 
Регистрация: 30.11.2011
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Krasiosoft Посмотреть сообщение
Можно и без DLL это сделать:
Можно, но не суть...да и код не Delphi, а C у вас ))

Цитата:
Сообщение от Krasiosoft Посмотреть сообщение
Для этого нужно запускать выполнение Вашего кода не в функции обработки сообщений, а в новом потоке, который должен создаваться при нажатии кнопки и убиваться при отжатии кнопки.
С этого места поподробнее, пожалуйста.

Цитата:
Сообщение от Stilet Посмотреть сообщение
По крайней мере не помешало бы услышать твою задачу. Зачем тебе понадобились хуки. Может тогда чего и посоветовать можно было бы.
Задачи как таковой и нет. Потихоньку изучаю Delphi, вот решил попробовать написать что-то вроде простенькой антиотдачи (автоматически уводит мышь-прицел в нужном направлении) для игры, так сказать первый шаг к читерству
vers0 вне форума Ответить с цитированием
Старый 09.08.2015, 11:22   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну не знаю... Хуки это вообще-то отладочный механизм. Так их использовать ИМХО бессмысленно. Ну или себе дороже.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.08.2015, 15:06   #8
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от vers0 Посмотреть сообщение
код не Delphi, а C у вас ))
Извините, перепутал, но это же WinAPI, поэтому должно быть все понятно, а если нет, сообщите, и я перепишу на Delphi.

Цитата:
Сообщение от vers0 Посмотреть сообщение
С этого места поподробнее, пожалуйста.
Общую информацию про потоки можно почитать тут.

Для работы с потоками в Delphi используется TThread.

И тут есть 2 варианта реализации:

1) Поток создается при нажатии кнопки и убиваться при отжатии кнопки.
2) Поток создается при запуске программы и ожидает события нажатия кнопки, выполняет Ваш код, а по событию отжатия кнопки опять переходит в ожидание.

Как по мне, то вариант 2 тут лучше подойдет. Хотя может и нет, если в потоке будет стоять sleep, и по отжатию кнопки он не сможет сразу перейти в ожидание.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).

Последний раз редактировалось Krasiosoft; 09.08.2015 в 15:21.
Krasiosoft вне форума Ответить с цитированием
Старый 09.08.2015, 15:39   #9
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

А какая вообще цель-то? Что нужно сделать/добиться? Вы что-то с чужим приложением делаете что ли? Что?
ResourceSpace вне форума Ответить с цитированием
Старый 09.08.2015, 15:46   #10
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Когда нажата кнопка мыши, нужно начать перемещать курсор в нужном направлении, а как только будет отжата кнопка мыши - прекратить перемещение.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка событий, при нажатии кнопки мыши citruswa Общие вопросы Delphi 2 29.02.2012 23:38
Остановка флеш-ролика при наведении мыши Nikirinka JavaScript, Ajax 0 23.01.2012 10:51
Остановка карусели при наведении курсора мыши. Не работает? daz JavaScript, Ajax 0 20.01.2011 09:22
событие при нажатии кнопки мыши за формой Izlom Помощь студентам 4 21.07.2010 16:02
Изменение кнопки при навдении указателя мыши Syltan JavaScript, Ajax 3 25.05.2010 15:41