Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> И СНОВА SHIFT, комбинация LSHIFT+ENTER 
:(
    Опции темы
CHERRY
Дата 30.7.2002, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Прохожий
*


Профиль
Группа: Участник
Сообщений: 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;
--------------------
Трясу надежды ветвь, но где желанный плод?
PM MAIL WWW   Вверх
Baa
Дата 30.7.2002, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 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
PM ICQ   Вверх
CHERRY
Дата 30.7.2002, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Прохожий
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.6.2002
Где: Одесса

Репутация: нет
Всего: -2



В Win95/98 GetKeyState не работает, поэтому нажатие правого и левого shift определяется через прерывание.
Но в комбинации с ENTER в приведенном выше коде левый и правый шифты перестают определяться.
--------------------
Трясу надежды ветвь, но где желанный плод?
PM MAIL WWW   Вверх
Mikel
Дата 30.7.2002, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 882
Регистрация: 30.3.2002
Где: Саратов

Репутация: 1
Всего: 2



Цитата(CHERRY @ 30.7.2002, 18:18)
В Win95/98 GetKeyState не работает, поэтому нажатие правого и левого shift определяется через прерывание.

Тогда GetAsyncKeyState- работает 100%


--------------------
...so remember, it's better to burn out than to fade away
PM MAIL ICQ   Вверх
CHERRY
Дата 30.7.2002, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Прохожий
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.6.2002
Где: Одесса

Репутация: нет
Всего: -2



Цитата (CHERRY @ 30.7.2002,18:18)
Я не цицатор, я ищу решение!

Очень содержательный ответ!
Если ты лично проверял эту ф-ю под Win 95/98 не сочти за труд,
правильный код. Я бъюсь уже 3 мемяца над решением. Под NT
системами у меня нет проблем. А под 95/98 трудности.
АСЕМБЛЕР-код мне подсказал Vit. Он отлично работает, но в комбинации с ENTER,
нет. Где ошибка в моем коде?
Заранее благодарен.
--------------------
Трясу надежды ветвь, но где желанный плод?
PM MAIL WWW   Вверх
Baa
Дата 31.7.2002, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: нет
Всего: 12



Вообще-то, ассемблерный код я тебе написал...но дело не в этом...на днях поставлю 98 и посморю, просто порты ввода-вывода не работают в НТ(система не дает).


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
Mikel
Дата 31.7.2002, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 882
Регистрация: 30.3.2002
Где: Саратов

Репутация: 1
Всего: 2



Лучше hook'ов могут быть только hook'и :)
Код
var hhandle:THandle;
   Shifts:record
          Left,right:BOOLEAN;
          end;

function KeyboardProc(code:integer;wParam:WPARAM;lParam:LPARAM):HResult;StdCall;Export;
Const KEY_LSHIFT=$2A0000;
     KEY_RSHIFT=$360000;
     KSTATE=$80000000;
begin
 if code<0 then
 begin
   Result:=CallNextHookEx(hhandle,Code,wParam,lParam);
   Exit;
 end;
  if (code=HC_ACTION)and(wparam in [0..255]) then
    begin
      if (wparam=vk_shift)and(lparam and $FF0000=KEY_LSHIFT) then Shifts.Left:=lparam and KSTATE=0;
      if (wparam=vk_shift)and(lparam and $FF0000=KEY_RSHIFT) then Shifts.Right:=lparam and KSTATE=0;
      if (lparam and KState<>0)and(wParam=13)and Shifts.Left then showmessage('LShift+Enter');
      if (lparam and KState<>0)and(wParam=13)and Shifts.Right then showmessage('RShift+Enter');
      if (lparam and KState<>0)and(wParam=13)and(GetAsyncKeyState(VK_CONTROL)and $8000<>0)then showmessage('CTRL+ENTER');

    end;
 CallNextHookEx(hhandle,Code,wParam,lParam);
 Result:= 0;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
hhandle:=SetWindowsHookEx(WH_KEYBOARD,@KeyboardProc,0,GetWindowLong(handle,GWL_ID));
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnhookWindowsHookEx(hhandle);
end;

Exports KeyboardProc;



--------------------
...so remember, it's better to burn out than to fade away
PM MAIL ICQ   Вверх
Baa
Дата 1.8.2002, 02:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: нет
Всего: 12



А зачем хуки, если в своей программе ловим?


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
Baa
Дата 4.8.2002, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: нет
Всего: 12



Вообще, все решается намного проще...вот так я делал дааавно :) кады еще 2К не было.
Код

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Bool((GetKeyState(VK_LSHIFT) < -126) and (GetKeyState(VK_CONTROL) < -126 )) then
ShowMessage ('ctrl+shift');

if Bool((GetKeyState(VK_LSHIFT) < -126) and (GetKeyState(VK_RETURN) < -126 ))      then
ShowMessage ('enter+shift');
end;



--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
Mikel
Дата 5.8.2002, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 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
PM MAIL ICQ   Вверх
cherry
Дата 7.8.2002, 21:01 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
Дата 8.8.2002, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 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
PM ICQ   Вверх
cherry
Дата 10.8.2002, 06:54 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
Дата 16.8.2002, 07:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Прохожий
*


Профиль
Группа: Участник
Сообщений: 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.
Пчему в пошаговом режиме код работает, а в скомпилированном нет?
--------------------
Трясу надежды ветвь, но где желанный плод?
PM MAIL WWW   Вверх
Mikel
Дата 16.8.2002, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 882
Регистрация: 30.3.2002
Где: Саратов

Репутация: 1
Всего: 2



Тебя мой hook не устраивает? Или религия не позволяет использовать ловушки в программах? :D


--------------------
...so remember, it's better to burn out than to fade away
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1669 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.