Я создал очень простое приложение VCL. Это просто форма с TMemo. Я добавил событие нажатия клавиши на TMemo.
procedure TForm1.Memo1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if (Key = Ord('X')) and (Shift * [ssCtrl, ssLeft] = [ssCtrl, ssLeft]) then
begin
ShowMessage('hi');
end;
end;
Несмотря на то, что я использую левый Клавиша CTRL + X, кажется, что ssLeft
никогда не может быть обнаружен. Почему это происходит?
Как описано здесь:
ssLeft — это не состояние клавиатуры, это состояние мыши. Т.е. вы проверяете, нажата ли левая кнопка мыши, а также (любая) клавиша Ctrl, когда вы нажимаете клавишу «X».
Чтобы проверить, нажата ли именно левая клавиша управления, а не (также) правая, вам нужно добавить это в свой тест:
USES WinAPI.Windows;
FUNCTION KeyPressed(VirtualKey : WORD) : BOOLEAN; INLINE;
BEGIN
Result:=(GetKeyState(VirtualKey) AND $80000000<>0)
END;
FUNCTION LeftCtrl : BOOLEAN; INLINE;
BEGIN
Result:=KeyPressed(VK_LCONTROL)
END;
FUNCTION RightCtrl : BOOLEAN; INLINE;
BEGIN
Result:=KeyPressed(VK_RCONTROL)
END;
procedure TForm1.Memo1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if (Key = Ord('X')) and (Shift*[ssCtrl, ssShift, ssAlt] = [ssCtrl]) and LeftCtrl and not RightCtrl then
begin
ShowMessage('hi');
end;
end;