Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.05;
Скачать: CL | DM;

Вниз

Определение нажатия левой и правой клавиши Ctrl   Найти похожие ветки 

 
Игорь Степанов   (2005-11-12 16:21) [0]

Уважаемые мастера,

Подскажите, пожалуйста, как определять нажатие левой или правой клавиши Ctrl?

С уважением,
Игорь Степанов


 
Плохиш ©   (2005-11-12 16:33) [1]

GetKeyState


 
Игорь Степанов   (2005-11-13 10:10) [2]

Я пытался использовать эту функцию, но у меня не получилсь. Нельзя ли написать код подробно.

Игорь Степанов


 
gdaujk ©   (2005-11-13 10:44) [3]

if GetKeyState(VK_RCONTROL) < 0
 then Edit2.Text := "Right Ctrl"
 else if GetKeyState(VK_LCONTROL) < 0
   then Edit2.Text := "Left Ctrl"
   else Edit2.Text := "";


 
Игорь Степанов   (2005-11-13 14:08) [4]

Я использую эту функцию для многократного определения нажатой клавиши:
{----------------------------------------------------------------}
function GetKeyState1(Key: Integer): Boolean;
var Buffer: TKeyboardState;
begin
 GetKeyboardState(Buffer);
 Result := Buffer[Key] <> 0;
end;
{-----------------------------------------------------------}
function GetRCTRL: Boolean;
begin
 Result := GetKeyState1(VK_RCONTROL);
end;
{--------------------------------------------------------------}
function GetLCTRL: Boolean;
begin
 Result := GetKeyState1(VK_LCONTROL);
end;
{---------------------------------------------------------------}
Сначала определяю нажатие Control
procedure TGKSF.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin  {VK_CONTOL=17 both for Left and Right Ctrl keys}
    If key=VK_CONTROL then  LRctrlkeys:=True;
    If key=VK_ESCAPE then  escpressed:=True;
end;
Потом определяю левая или правая клавиша нажата:
 LeftCtrl:=False; RightCtrl:=False;
    LControl:=0;
    RControl:=0;
   oncemore:
    escpressed:=False;
    LRctrlkeys:=False;
    LeftCtrl:=False; RightCtrl:=False;
    Repeat
   Application.ProcessMessages;
   If escpressed then begin
   GKSF.Close;
   exit;
   end;
   Until  LRctrlkeys;
   LeftCtrl:= GetLCTRL;
   If LeftCtrl then begin
   MessageDlg("Нажата левая клавиша Ctrl",mtInformation,[mbOK],0);
   goto oncemore;
   end; {If LeftCtrl }
   RightCtrl:= GetRCTRL;
   If RightCtrl then begin
   MessageDlg("Нажата правая клавиша Ctrl",mtInformation,[mbOK],0);
   goto oncemore;
   end; {If RightCtrl }

Однако при многократном нажатии происходит неправильное определение.
Как можно использовать скэн-коды, которыми я успешно  пользовался при работе в Паскале под DOS.

Спасибо,
Игорь Степанов


 
gdaujk ©   (2005-11-13 17:52) [5]

Блин, ну всё же проще простого:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 if GetKeyState(VK_RCONTROL) < 0
   then MessageBox(0, "Right Ctrl", "", 0)
   else if GetKeyState(VK_LCONTROL) < 0
     then MessageBox(0, "Left Ctrl", "", 0);
end;


PS: Не используй Goto - это не есть хорошо...


 
Игорь Степанов   (2005-11-19 13:00) [6]

Подскажите, пожалуйста, можно ли получить скэн-коды нажатия и отпускания каждой клавиши на клавиатуре с помощью функций API?

Игорь Степанов


 
gdaujk ©   (2005-11-19 14:42) [7]

Будь по-твоему. Лови события WM_KEYDOWN/WM_KEYUP

WM_KEYUP  
  nVirtKey = (int) wParam;    // virtual-key code
  lKeyData = lParam;          // key data

scan_code :=  (KeyData shr 8) shl 24;
RIGHT_KEY_PUSH := KeyData and $01000000 > 0;

PS: сам не пробовал, зачем нужен scan code, представляю смутно...


 
Игорь Степанов   (2005-11-19 19:17) [8]

Спасибо, я попробую. Попытаюсь объяснить, зачем я ищу скэн-коды.

Мне необходимо определить, была ли нажата  и тут же отпущена левая или правая клавиша Ctrl. В психофизиологическом тесте испытуемый должен в ответ на один сигнал нажать и отпустить левую Ctrl, а в ответ на другой сигнал - правую Ctrl.

Поэтому функция GetkeyState не подходит, так как она определяет, удерживается ли в нажатом положении левая или правая клавиша Ctrl. Мне же необходимо определить именно событие - отпускание клавиши Ctrl. Наверное, это лучше всего сделать с помощью скэн-кода отпускание клавиши. Как его получить в Windows? В DOS-программах я это делал элементарно.

Игорь Степанов


 
gdaujk ©   (2005-11-20 11:11) [9]

>Игорь Степанов   (19.11.05 19:17) [8]
>Мне же необходимо определить именно событие - отпускание клавиши Ctrl.


Я наконец-то придумал. Form1.KeyPreview = True; Далее создайте у Form OnKeyDown и OnKeyUp со следующим кодом:

...

implementation

{$R *.dfm}

type
 TCtrlDown = (myNone, myLeft, myRight);

var
 CtrlDown: TCtrlDown;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 if Key = VK_CONTROL
 then
   begin
     if GetKeyState(VK_RCONTROL) < 0
     then CtrlDown := myRight
     else if GetKeyState(VK_LCONTROL) < 0
       then CtrlDown := myLeft;
   end
 else CtrlDown := myNone;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 if (Key = VK_CONTROL) then
   case CtrlDown of
     myNone: Label1.Caption := "";
     myLeft: Label1.Caption := "Left";
     myRight:Label1.Caption := "Right";
   end
 else Label1.Caption := "";
 CtrlDown :=  myNone;
end;


 
Игорь Степанов   (2005-11-22 18:23) [10]

Уважаемый Дмитрий (gdaujk),

Я опробовал Ваш последний код и выяснил, что всё прекрасно заработало. Это самый лучший способ определения кратковременного нажатия и отпускания таких клавиш как Shift, Ctrl и Alt.
Огромное Вам спасибо за конструктивную помощь!!! Я Вам чрезвычайно благодарен.

Большое спасибо всем, принявшим участие в дискуссии.

С пожеланиями дальнейших успехов и с надеждой на дальнейшую помощь,

Игорь Степанов



Страницы: 1 вся ветка

Текущий архив: 2006.02.05;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.028 c
2-1137779782
SneG
2006-01-20 20:56
2006.02.05
Рисовать на Canvas


15-1137183247
tesseract
2006-01-13 23:14
2006.02.05
Выгорит ли reactos?


2-1137602498
Silver__Dragon
2006-01-18 19:41
2006.02.05
Что за ошибка?


2-1137789495
Alexander-Sun
2006-01-20 23:38
2006.02.05
Оформление XP


15-1137143922
kaif
2006-01-13 12:18
2006.02.05
Вопрос по Java