![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| CHERRY |
|
|||
![]() Прохожий ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 17.6.2002 Где: Одесса Репутация: нет Всего: -2 |
Продолжаю тему правого/левого SHIFT.
Нужно отслеживать комбинацию CONTROL+ENTER, LSHIF+ENTER и RSHIFT+ENTER. CONTROL+ENTER - работает, а с шифтами проблема, хотя отдельно asm-код работает. Что я делаю неправильно? procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var RSHIFT, LSHIFT: Byte; begin If key=VK_RETURN Then BEGIN IF ((Word(GetKeyState(VK_CONTROL)) and $8000)<>0) Then ShowMessage('CONTROL+ENTER'); RSHIFT := 0; LSHIFT := 0; asm in al, 60h cmp al, 36h jne @@exit mov RSHIFT,1 @@exit: end; asm in al, 60h cmp al, 2Ah jne @@exit mov LSHIFT,1 @@exit: end; if RSHIFT = 1 then ShowMessage('RSHIFT+ENTER'); if LSHIFT = 1 then ShowMessage('LSHIFT+ENTER'); END; End; --------------------
Трясу надежды ветвь, но где желанный плод? |
|||
|
||||
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: нет Всего: 12 |
Че-то я не совсем понял, че там не работает, но вот этим я может отвечу.
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Bool((GetKeyState(VK_LSHIFT) and $8000) and (GetKeyState(VK_CONTROL))) then ShowMessage ('ctrl+shift'); if Bool((GetKeyState(VK_LSHIFT) and $8000) and (GetKeyState(VK_RETURN))) then ShowMessage ('enter+shift'); end; -------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| CHERRY |
|
|||
![]() Прохожий ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 17.6.2002 Где: Одесса Репутация: нет Всего: -2 |
В Win95/98 GetKeyState не работает, поэтому нажатие правого и левого shift определяется через прерывание.
Но в комбинации с ENTER в приведенном выше коде левый и правый шифты перестают определяться. --------------------
Трясу надежды ветвь, но где желанный плод? |
|||
|
||||
| Mikel |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 882 Регистрация: 30.3.2002 Где: Саратов Репутация: 1 Всего: 2 |
Тогда GetAsyncKeyState- работает 100% -------------------- ...so remember, it's better to burn out than to fade away |
|||
|
||||
| CHERRY |
|
|||
![]() Прохожий ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 17.6.2002 Где: Одесса Репутация: нет Всего: -2 |
Цитата (CHERRY @ 30.7.2002,18:18)
Я не цицатор, я ищу решение! Очень содержательный ответ! Если ты лично проверял эту ф-ю под Win 95/98 не сочти за труд, правильный код. Я бъюсь уже 3 мемяца над решением. Под NT системами у меня нет проблем. А под 95/98 трудности. АСЕМБЛЕР-код мне подсказал Vit. Он отлично работает, но в комбинации с ENTER, нет. Где ошибка в моем коде? Заранее благодарен. --------------------
Трясу надежды ветвь, но где желанный плод? |
|||
|
||||
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: нет Всего: 12 |
Вообще-то, ассемблерный код я тебе написал...но дело не в этом...на днях поставлю 98 и посморю, просто порты ввода-вывода не работают в НТ(система не дает).
-------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| Mikel |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 882 Регистрация: 30.3.2002 Где: Саратов Репутация: 1 Всего: 2 |
Лучше hook'ов могут быть только hook'и
-------------------- ...so remember, it's better to burn out than to fade away |
|||
|
||||
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: нет Всего: 12 |
А зачем хуки, если в своей программе ловим?
-------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: нет Всего: 12 |
Вообще, все решается намного проще...вот так я делал дааавно
-------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| Mikel |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 882 Регистрация: 30.3.2002 Где: Саратов Репутация: 1 Всего: 2 |
Да, но надо разобрать левый/правый shift, а в 98 только на vk_shif приходит, а на vk_lshift/vk_rshift нету.
-------------------- ...so remember, it's better to burn out than to fade away |
|||
|
||||
| cherry |
|
|||
|
Unregistered |
Приведенный ниже код работает только в пошаговом режиме.
А вне отладчика не работает. Почему? procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var RLSHIFT: Byte; begin If key=VK_RETURN Then BEGIN RLSHIFT:=0; asm in al, 60h cmp al, 36h mov RLSHIFT,al end; if (RLSHIFT = 182) then ShowMessage('ПРАВЫЙ SHIFT НАЖАТ+ENTER'); if (RLSHIFT = 170) then ShowMessage('ЛЕВЫЙ SHIFT НАЖАТ+ENTER'); END; end; |
|||
|
||||
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: нет Всего: 12 |
asm
in al, 60h cmp al, 36h mov RLSHIFT,al end; Если ты решил делать так - то хоть сотри cmp al, 36h все равно далее нету условного перехода и т.д. посему эт просто не надо далее, внеси RLSHIFT:=0; в асм т.е. asm xor al, al mov RLSHIFT, al in al, 60h mov RLSHIFT, al end; А вообще, я тебе уже написал, как заставить работать GetKeyState под 98... -------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| cherry |
|
|||
|
Unregistered |
Меня затерли на форуме. Пароль не воспринимается, письма на забывчивость пароля не приходят по адресу [email protected], несмотря ни на что, продолжаю задавать не решенный вопрос:
If key=VK_RETURN Then BEGIN asm xor al, al mov RLSHIFT, al in al, 60h mov RLSHIFT, al end; if (RLSHIFT = 182) then ShowMessage('ПРАВЫЙ SHIFT НАЖАТ+ENTER'); if (RLSHIFT = 170) then ShowMessage('ЛЕВЫЙ SHIFT НАЖАТ+ENTER'); END; Если поставить в отладчике точку прерывания на начале кода, то RLSHIFT возвращает нужное значение. Если поставить в отладчике точку прерывания на IF, то код не работает. ИНАЧЕ ГОВОРЯ В ПОШАГОВОИ РЕЖИМЕ РАБОТАЕТ, А САМ ПО СЕБЕ НЕТ. КТО СМОЖЕТ МЕНЯ ОСВОБОДИТЬ ОТ МУЧЕНИЙ? С большим компьютерным приветом CHERRY(лишенный на форуме имени) |
|||
|
||||
| CHERRY |
|
|||
![]() Прохожий ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 17.6.2002 Где: Одесса Репутация: нет Всего: -2 |
Я вернулся. Спасибо тому, кто за этим наблюдает.
Но неужели на столь уважаемом форуме моя затертая тема так и умрет? Вот код: If key=VK_RETURN Then BEGIN asm xor al, al mov RLSHIFT, al in al, 60h mov RLSHIFT, al end; if (RLSHIFT = 182) then ShowMessage('ПРАВЫЙ SHIFT НАЖАТ+ENTER'); if (RLSHIFT = 170) then ShowMessage('ЛЕВЫЙ SHIFT НАЖАТ+ENTER'); END; Если поставить точку прерывания поставить скажем в строке "xor al, al" то значения RLSHIFT принимают нужные значения, если остановить программу в строке if (RLSHIFT = 182) then ..., то значения RLSHIFT принимает 28. Пчему в пошаговом режиме код работает, а в скомпилированном нет? --------------------
Трясу надежды ветвь, но где желанный плод? |
|||
|
||||
| Mikel |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 882 Регистрация: 30.3.2002 Где: Саратов Репутация: 1 Всего: 2 |
Тебя мой hook не устраивает? Или религия не позволяет использовать ловушки в программах?
-------------------- ...so remember, it's better to burn out than to fade away |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |