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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.09.2016, 20:33   #1
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию Почему так получается?

Собственно реализовал алгоритм антизалипания ЛКМ и ПКМ. То есть чтобы при зажатии ЛКМ или ПКМ это вызывало одно действие, а не куча действий сразу. Реализовал так:
Код:
Глобальные переменные: 
var
  naj,otj, naj_R,otj_R,otj_ESC,naj_ESC:BOOL;// сохранения в переменных состояния нажатия ЛКМ отжата или нажата.
При создании формы: 
naj:=False;
  otj:=True;
  naj_R:=False;
  otj_R:=True;   
  naj_ESC:=False;
  otj_ESC:=True;

В таймере на c интервалом 30:

W_l:=GetAsyncKeyState(VK_LBUTTON);// определения параметров состояния кнопок мыши
W_R:=GetAsyncKeyState(VK_RBUTTON);//
W_ESC:=GetAsyncKeyState(vk_f1);// 

 if (( W_ESC = $8001)or(W_R = $8001)or( W_l = $8001)) then  begin

         if ( (otj=True)or(otj_R=True)or(otj_ESC=True))then begin 
          //// действия
          end;
     if (W_l = $8001) then begin
     naj:=True;// переменную нажата в true
     otj:=False;// переменную отжата в false
     end;
     if (W_R = $8001) then begin
     naj_R:=True;// переменную нажата в true
     otj_R:=False;// переменную отжата в false
     end;
     if (W_ESC = $8001) then begin
     naj_ESC:=True;// переменную нажата в true
     otj_ESC:=False;// переменную отжата в false
     end;
end

if (W_l = $8001) then begin
naj:=False;// переменную нажата в true
otj:=True;// переменную отжата в false
end;
if (W_R = $8001) then begin
naj_R:=False;// переменную нажата в true
otj_R:=True;// переменную отжата в false
end;
if (W_ESC = $8001) then begin
 naj_ESC:=False;// переменную нажата в true
otj_ESC:=True;// переменную отжата в false
end;
Я понимаю что код очень избыточный, не судите строго.

Здесь я одновременно с ЛКМ и ПКМ еще попытался тоже самое сделать с клавишей f1 клавиатуры. Так вот с ЛКМ и ПКМ все нормально, а с f1 не работает, происходит многократное повторение действия.


Т. е . если у меня нету какой то ошибки то попросту функция GetAsyncKeyState(vk_f1) отличается от GetAsyncKeyState(VK_LBUTTON) и GetAsyncKeyState(VK_RBUTTON)

В чем подвох?

Последний раз редактировалось Illusiony; 05.09.2016 в 20:35.
Illusiony вне форума Ответить с цитированием
Старый 05.09.2016, 21:22   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в MSDN советуют не полагаться на значение первого бита, он только для совместимости.

ваше приложение активно хоть в момент теста?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.09.2016, 22:03   #3
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
в MSDN советуют не полагаться на значение первого бита, он только для совместимости.

ваше приложение активно хоть в момент теста?
В смысле? у меня работают ЛКМ и ПКМ так, а f1 нет. Я отслеживаю клики над другим приложением ( не Delphi). Соответственно окно того приложения и активно.
Illusiony вне форума Ответить с цитированием
Старый 05.09.2016, 22:17   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

залогируйте значение результата для клавиши, похоже мышь работает всегда, но согласно MSDN, она не годится вне своего приложения:
https://msdn.microsoft.com/ru-ru/lib...or=-2147217396
Цитата:
The return value is zero for the following cases:
The current desktop is not the active desktop
The foreground thread belongs to another process and the desktop does not allow the hook or the journal record.
что объясняет поведение пары игр впрочем.

для перехвата есть иные методы(и LowLevel хук не требует админских прав и не требует DLL)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.09.2016, 21:54   #5
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Пепел Феникса, возможно я не так высказался:
Код:
В смысле? у меня работают ЛКМ и ПКМ так, а f1 нет.
Здесь я имел ввиду как и в предыдущем сообщении что f1 многократно посылает действия в отличие от однократных ЛКМ и ПКМ при нажатии и удержании.

В общем решил проблему довольно просто, но и некрасиво. Однако мне сгодится:

В общем алгоритм примерно такой:
- имеем два таймера с низким интервалом и запущены оба сразу:
Код:
procedure TForm1.tmr1Timer(Sender: TObject);
begin
if GetAsyncKeyState(VK_LBUTTON)<>0 then begin 
tmr1.Enabled:=False;
mmo1.Lines.Add('LBUTTON');// необходимые действия при нажатии ЛКМ
end;
if GetAsyncKeyState(VK_RBUTTON)<>0 then begin
mmo1.Lines.Add('RBUTTON');// необходимые действия при нажатии ПКМ
end;
end;

procedure TForm1.tmr2Timer(Sender: TObject);
begin
if GetAsyncKeyState(VK_LBUTTON)or GetAsyncKeyState(VK_RBUTTON)=0 then begin //
tmr1.Enabled:=True;
end;
end;
Здесь добавить еще
Код:
GetAsyncKeyState(vk_f1)
и все получается как надо.
Illusiony вне форума Ответить с цитированием
Старый 07.09.2016, 22:06   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вы имеете в виду при удержании?
так ведь логично
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.09.2016, 22:11   #7
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
вы имеете в виду при удержании?
так ведь логично
Да, именно.
Illusiony вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему так получается 1,1 mod 1 = 0,099999 TRIZER Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 16.08.2011 01:23
так и не получается сделать вход ilushka2306 PHP 3 14.05.2011 14:00
Почему-то не получается.... lionman Помощь студентам 7 07.12.2008 11:35