为什么左 ctrl 不触发 ssLeft?
Why left ctrl doesn't trigger ssLeft?
我创建了一个非常简单的 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 不是键盘状态,而是鼠标状态。 IE。当您按下“X”键时,您正在检查是否按下了鼠标左键以及(任何)Ctrl 键。
为了检查是否专门按下了左控制键,而不是(也)右控制键,您需要将此添加到您的测试中:
USES WinAPI.Windows;
FUNCTION KeyPressed(VirtualKey : WORD) : BOOLEAN; INLINE;
BEGIN
Result:=(GetKeyState(VirtualKey) AND 000000<>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;
我创建了一个非常简单的 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 不是键盘状态,而是鼠标状态。 IE。当您按下“X”键时,您正在检查是否按下了鼠标左键以及(任何)Ctrl 键。
为了检查是否专门按下了左控制键,而不是(也)右控制键,您需要将此添加到您的测试中:
USES WinAPI.Windows;
FUNCTION KeyPressed(VirtualKey : WORD) : BOOLEAN; INLINE;
BEGIN
Result:=(GetKeyState(VirtualKey) AND 000000<>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;