在Delphi中定义快捷方式的“正确”方式是哪种?

有很多关于如何在Delphi程序中定义ShortCut的例子,但是
他们归结为两种不同的方式:

>将任何scCtrl,scShift和scAlt常量添加到键的Ord()
>使用Menus.ShortCut功能

例如

Action.ShortCut := scCtrl + scShift + Ord('K');
// vs
Action.ShortCut := Menus.ShortCut(Word('K'),[ssCtrl,ssShift]);

这两种方式之一是最好的?如果是,哪一个为什么?

解决方法

代码几乎相同,但ShortCut有一些额外的检查:
function ShortCut(Key: Word; Shift: TShiftState): TShortCut;
begin
  Result := 0;
  if HiByte(Key) <> 0 then Exit; // if Key is national character then it can't be used as shortcut
  Result := Key;
  if ssShift in Shift then Inc(Result,scShift); // this is identical to "+" scShift
  if ssCtrl in Shift then Inc(Result,scCtrl);
  if ssAlt in Shift then Inc(Result,scAlt);
end;

因为RegisterHotKey功能使用Virtual key codes(其值从$00到$FE)这个额外的检查是重要的.

请注意,实际的Ord函数代替Ord文档,返回smallint(带符号的Word),所以使用国家字符可以改变包含在ShortCut值的Hi字节中的修改器.

所以更好的是使用ShortCut功能.

相关文章

ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c++ 调用, 抽空研究了一下该库的最新版 ,把...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的功能是:将源操作数送到目的操作数中,即:...
有三个API函数可以运行可执行文件WinExec、ShellExecute和CreateProcess。 1.CreateProcess因为使用复杂...
API原型: Declare Function MoveFileEx& Lib "kernel32" Alias "MoveFileExA" (By...