Текущий архив: 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