![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Определение нажатия левой и правой клавиши Ctrl [D7, Win2k, WinXP]
Игорь Степанов © (2005-11-12 16:21:00)Уважаемые мастера,
Подскажите, пожалуйста, как определять нажатие левой или правой клавиши Ctrl?
С уважением,
Игорь Степанов
Игорь Степанов (2005-11-22 18:23:00) [1]Уважаемый Дмитрий (gdaujk),
Я опробовал Ваш последний код и выяснил, что всё прекрасно заработало. Это самый лучший способ определения кратковременного нажатия и отпускания таких клавиш как Shift, Ctrl и Alt.
Огромное Вам спасибо за конструктивную помощь!!! Я Вам чрезвычайно благодарен.
Большое спасибо всем, принявшим участие в дискуссии.
С пожеланиями дальнейших успехов и с надеждой на дальнейшую помощь,
Игорь Степанов
gdaujk (2005-11-20 11:11:00) [2]>Игорь Степанов (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-19 19:17:00) [3]Спасибо, я попробую. Попытаюсь объяснить, зачем я ищу скэн-коды.
Мне необходимо определить, была ли нажата и тут же отпущена левая или правая клавиша Ctrl. В психофизиологическом тесте испытуемый должен в ответ на один сигнал нажать и отпустить левую Ctrl, а в ответ на другой сигнал - правую Ctrl.
Поэтому функция GetkeyState не подходит, так как она определяет, удерживается ли в нажатом положении левая или правая клавиша Ctrl. Мне же необходимо определить именно событие - отпускание клавиши Ctrl. Наверное, это лучше всего сделать с помощью скэн-кода отпускание клавиши. Как его получить в Windows? В DOS-программах я это делал элементарно.
Игорь Степанов
gdaujk (2005-11-19 14:42:00) [4]Будь по-твоему. Лови события 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 13:00:00) [5]Подскажите, пожалуйста, можно ли получить скэн-коды нажатия и отпускания каждой клавиши на клавиатуре с помощью функций API?
Игорь Степанов
gdaujk (2005-11-13 17:52:00) [6]Блин, ну всё же проще простого:
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-13 14:08:00) [7]Я использую эту функцию для многократного определения нажатой клавиши:
{----------------------------------------------------------------}
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 10:44:00) [8]
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 10:10:00) [9]Я пытался использовать эту функцию, но у меня не получилсь. Нельзя ли написать код подробно.
Игорь Степанов
Плохиш (2005-11-12 16:33:00) [10]GetKeyState