以下是我的示例代码:
1. 设置Form的keypreview设置为true.
2. 响应KeyPress事件
procedure TForm2.FormKeyPress(Sender: TObject; var Key: Char);
begin
if Key in ['a','A'] then
begin
Edit1.SetFocus;//如果按a或A就将窗口焦点移动到Edit1控件。
end;
end;
提示: 以上代码是比较容易、简单的处理,但也有一些需要注意的地方:
1. 焦点的转移只有在当前的父窗口获取焦点的时候,才会执行成功。
2. 需要注意FormKeyPress会一直响应按键A,所以,假设你正在编辑框中按下字母A,焦点也会转移。由于不知道你具体的意图,所以上面的代码就是按你的要求写的。如果感觉有点不好,则可以进一步修改代码,比如:过滤一下,只响应你需要的,或者将 A 换成其他容易区别开的。
FormKeyPress 通常只响应字符,如果是有特殊键,比如ctrl键,那就换成响应 FormKeyDown、up。
设置热键分两种:程序内部快捷键、全局快捷键
内部快捷键比较简单,最常用的一种方式是使用action,设置其ShortCut属性
全局快捷键相对复杂,需要注册热键,尔后处理Windows消息:
如设置全局F2快捷键
var C_MyKey_ID:Word;
C_MyKey_ID:= GlobalAddAtom('MyHotHotKey');
RegisterHotKey(Handle, C_MyKey_ID, 0, VK_F2);
然后处理Windows消息:
procedure MyHotKey(var msg: TWMHotKey); message WM_HOTKEY;
begin
if msg.HotKey = C_MyKey_ID then
begin
ShowMessage('热键启动');
end;
end;
支持 windblast的方案。