设置ALT+2,Home,End,Back,Delete等的功能键遇到的有关问题
设置ALT+2,Home,End,Back,Delete等的功能键遇到的问题。
我在出窗口上有一个TEdit控件和一个TButton控件
在Form.Create时,我设置了KeyPreview:= True;
然后在KeyDown事件中过滤按键
procedure TfrmMain.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
VK_F2: ;//按下F2
VK_F3{, VK_ADD小键盘+}: ;//按下F3,和小键盘的 "+ "号键
$30..$39{ VK_0,VK_1,VK_3 - VK_9 },
$41..$5A{ VK_A - VK_Z },
VK_NUMPAD0..VK_NUMPAD9,
VK_HOME, VK_END,
VK_BACK, VK_DELETE:
begin
if (Shift = [ssAlt]) and (Key = $32) then begin
// 按下 ALT+2 时
end else begin
// 当焦点不在Edit上时,按下 A-Z,0-9,Home,End,Back,Delete键都会自动回到Edit,并且输入按下的Key
if not Edit1.Focused then begin
Edit1.SetFocus;
// 这里暂时用了模拟键盘的方法
keybd_event(Key, 0, 0, 0);
keybd_event(Key, 0, KEYEVENTF_KEYUP, 0);
end;
end;
end;
end;
end;
问题1:
当按下Alt+2时,会正确跳到处理Alt+2的地方,但如果当前焦点在Edit的时候,在Edit中同样会输入 "2 "这个字符。有没有方法不让Edit输入这个字符呢?
问题2:
在焦点不在Edit上时,按下A-Z,0-9等按键会自动将焦点返回到Edit,但如果不写keybd_event这2行模拟键盘敲击事件的代码,在Edit中就不会输入按下的字符。
我只查到通过SendMessage(hwnd, WM_SETTEXT, 0, Longint(str));的方法。但这个方法是设置整个Edit.Text,并不是往后加一个字符。
能不能通过发送消息或其他方法实现模拟键盘敲击的功能,当然并不是光增加字符,因为还有Home,End,Back和Delete键。
------解决方案--------------------
if not Edit1.Focused then
begin
Edit1.SetFocus;
edit1.Text:=edit1.Text+char(Key);
end;
------解决方案--------------------
我在出窗口上有一个TEdit控件和一个TButton控件
在Form.Create时,我设置了KeyPreview:= True;
然后在KeyDown事件中过滤按键
procedure TfrmMain.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
VK_F2: ;//按下F2
VK_F3{, VK_ADD小键盘+}: ;//按下F3,和小键盘的 "+ "号键
$30..$39{ VK_0,VK_1,VK_3 - VK_9 },
$41..$5A{ VK_A - VK_Z },
VK_NUMPAD0..VK_NUMPAD9,
VK_HOME, VK_END,
VK_BACK, VK_DELETE:
begin
if (Shift = [ssAlt]) and (Key = $32) then begin
// 按下 ALT+2 时
end else begin
// 当焦点不在Edit上时,按下 A-Z,0-9,Home,End,Back,Delete键都会自动回到Edit,并且输入按下的Key
if not Edit1.Focused then begin
Edit1.SetFocus;
// 这里暂时用了模拟键盘的方法
keybd_event(Key, 0, 0, 0);
keybd_event(Key, 0, KEYEVENTF_KEYUP, 0);
end;
end;
end;
end;
end;
问题1:
当按下Alt+2时,会正确跳到处理Alt+2的地方,但如果当前焦点在Edit的时候,在Edit中同样会输入 "2 "这个字符。有没有方法不让Edit输入这个字符呢?
问题2:
在焦点不在Edit上时,按下A-Z,0-9等按键会自动将焦点返回到Edit,但如果不写keybd_event这2行模拟键盘敲击事件的代码,在Edit中就不会输入按下的字符。
我只查到通过SendMessage(hwnd, WM_SETTEXT, 0, Longint(str));的方法。但这个方法是设置整个Edit.Text,并不是往后加一个字符。
能不能通过发送消息或其他方法实现模拟键盘敲击的功能,当然并不是光增加字符,因为还有Home,End,Back和Delete键。
------解决方案--------------------
if not Edit1.Focused then
begin
Edit1.SetFocus;
edit1.Text:=edit1.Text+char(Key);
end;
------解决方案--------------------