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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.08.2015, 17:55
helper999999 helper999999 вне форума
Прохожий
 
Регистрация: 30.09.2014
Сообщения: 32
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию Состояние клавиши

Добрый вечер. Подскажите пожалуйста как определить состояние клавиши нажата ли или нет. Да пример желательно с помощью вставки asm. Заранее благодарю.

Пример:
Код:
function down: Boolean;
begin
asm
//....
end;
end;
Ответить с цитированием
  #2  
Старый 17.08.2015, 18:09
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Код:
SHORT WINAPI GetKeyState(
  _In_ int nVirtKey
);
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #3  
Старый 17.08.2015, 18:28
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Нажата это кажись прерывание 60h?
Ответить с цитированием
  #4  
Старый 17.08.2015, 18:55
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Нет в винде никаких программных прерываний. Вернее они есть, но их крайне мало, и они не совпадают с досовскими, потому что это крайне убогий и ущербный способ предоставления сервисов ОС.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
ApxaHGe1 (17.08.2015)
  #5  
Старый 17.08.2015, 22:27
helper999999 helper999999 вне форума
Прохожий
 
Регистрация: 30.09.2014
Сообщения: 32
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Нажата это кажись прерывание 60h?
а как полностью выполнить проверку? чтобы было либо true либо false.
Ответить с цитированием
  #6  
Старый 18.08.2015, 05:51
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Это работает лишь в очень старых версиях Windows, теперь такое блокируется на уровне драйверной "обвязки" ядра, другими словами GetKeyState самый подходящий вариант для определения состояния конкретной клавиши, иначе есть ещё несколько способов, но они тоже за здоровый образ жизни без "асмы", напр.
Код:
function down: Boolean;
var
 i: integer;
begin
 Result:= false;
 for i := 0 to 255 do if GetAsyncKeyState(i) <> 0 then Result:= true;
end;
мышиные кнопаря тоже отслеживаются
Ответить с цитированием
  #7  
Старый 18.08.2015, 13:10
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Зачем же такой гемор с циклом по всем кнопкам, когда есть GetKeyboardState если нужно несколько клавиш?
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #8  
Старый 18.08.2015, 16:07
helper999999 helper999999 вне форума
Прохожий
 
Регистрация: 30.09.2014
Сообщения: 32
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
Зачем же такой гемор с циклом по всем кнопкам, когда есть GetKeyboardState если нужно несколько клавиш?
а как именно?
Ответить с цитированием
  #9  
Старый 18.08.2015, 16:28
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Bargest
Зачем же такой гемор с циклом по всем кнопкам, когда есть GetKeyboardState если нужно несколько клавиш?
А где вы несколько клавиш-то увидели увжмклг, когда топикстартеру явно нужен весь "диапазон" клавиш? Понятно, что передав вышеприведённой вами функции структуру типа TKeyboardState на заполнение легче отследить отдельные кнопки, а вот состояние по всем одновременно всёравно придётся отслеживать циклом
Ответить с цитированием
  #10  
Старый 18.08.2015, 16:56
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Таки ТС нужна конкретная кнопка, а не диапазон:
Цитата:
состояние клавиши нажата ли или нет
просто "функция", точнее пустые операторные скобки с заголовком, предоставленные ТС-ом в первом посте, не учитывают прием конкретной клавиши в аргументе. Вангую, что имеется в виду проверка всегда одной и той же клавиши, жестко заданной в коде. Для этого нужно просто вызвать один раз getkeystate/getasynckeystate с нужным номером кнопки,
и я не понимаю, почему ТС до сих пор не вбил эти два слова в гугле и не получил ответ на свой вопрос.
Касаемо цикла:
Цитата:
состояние по всем одновременно всёравно придётся отслеживать циклом
GetKeyboardState заполнит весь массив сразу за один вызов. Только цикл с проверкой на ноль байтиков из массива гораздо менее нагрузочен, чем 256 вызовов API функции, которая, вероятно, еще и к дровам обращается каждый раз. В любом случае, это ТС не нужно.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 18.08.2015 в 17:02.
Ответить с цитированием
  #11  
Старый 18.08.2015, 17:57
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Оффтоп:
Может быть и правда, как обычно, простое непонимание заданного вопроса здесь наблюдается с моей стороны ждём прояснения ситуации с позиции автора

А если конкретная клавиша нужна, то тогда вот компиляция из всего вышесказанного на примере наблюдения за состоянием Shift

Код:
function ShiftDown : boolean;
var
State : TKeyboardState;
begin
 GetKeyboardState(State);
 Result:= ((State[VK_SHIFT] and 128) <> 0);
 // или
 // Result:= (GetKeyState(VK_SHIFT) <> 0);
 // или
 // Result:= (GetAsyncKeyState(VK_SHIFT) <> 0);
end;
Ответить с цитированием
  #12  
Старый 18.08.2015, 18:53
helper999999 helper999999 вне форума
Прохожий
 
Регистрация: 30.09.2014
Сообщения: 32
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Оффтоп:
Может быть и правда, как обычно, простое непонимание заданного вопроса здесь наблюдается с моей стороны ждём прояснения ситуации с позиции автора

А если конкретная клавиша нужна, то тогда вот компиляция из всего вышесказанного на примере наблюдения за состоянием Shift

Код:
function ShiftDown : boolean;
var
State : TKeyboardState;
begin
 GetKeyboardState(State);
 Result:= ((State[VK_SHIFT] and 128) <> 0);
 // или
 // Result:= (GetKeyState(VK_SHIFT) <> 0);
 // или
 // Result:= (GetAsyncKeyState(VK_SHIFT) <> 0);
end;
я делал так,
Код:
function downbutton : BOOLEAN;
begin
  if GetKeyState($10) < 0 then Result := True
    else Result := False;
end;

вот и подумал можно ли тоже самое реализовать только со вставкой asm
Ответить с цитированием
  #13  
Старый 18.08.2015, 18:59
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

if совершенно лишний, проще result := GetKeyState(16) <> 0.
Цитата:
вот и подумал можно ли тоже самое реализовать только со вставкой asm
Скомпилируй, дизассемблируй и вставь асм-код. Только зачем?
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #14  
Старый 18.08.2015, 22:34
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от helper999999
...вот и подумал можно ли тоже самое реализовать только со вставкой asm
К сожалению, это теперь невозможно, мнгувж деятели из мелкомяконьких полностью блокировали такую возможность, приветствуется только обращение к winAPI, редиски - разработчики, про "астму" можете забыть, а может быть, это и к лучшему, багов в этой операционке и так предостаточно
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter