Главная страница
    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.47 MB
Время: 0.01 c
3-1133870327
Lansky
2005-12-06 14:58
2006.02.05
OpenDataSource


4-1132842612
ga3
2005-11-24 17:30
2006.02.05
как в консольном приложении отловить выход из Виндовс?


1-1136037580
Баяр
2005-12-31 16:59
2006.02.05
как сделать, чтоб не гас монитор


1-1135680585
MaxY
2005-12-27 13:49
2006.02.05
Синхронизация скроллинга в нескольких гридах !?


1-1136633399
френк
2006-01-07 14:29
2006.02.05
INI и XML





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский