これは可能ですか?たとえば、Notepad++ はそれを行いますが、単にアクションやメニュー項目などのコンポーネントに割り当てようとしても機能しません。割り当てられているイベントは単にトリガーしません。
そこで、Google に質問しました。なだ。次に、さまざまなショートカット関数 (この場合は TextToShortCut と ShortCutToText) をステップ実行してみました。
最初の TextToShortCut は、'Ctrl+A' (文字列) などを次の 16 ビット値に変換します。
(uint)A | (uint)Ctrl
ほとんどの場合、正常に動作します。ただし、次の奇妙なことに気付きました。
// Try converting back and forward...
TextToShortCut('Ctrl+/') = 16495
// That's incorrect. It should be:
Ord('/') or scCtrl = 16431
// Incorrect too
ShortCutToText(16495) = 'Ctrl+/'
// This is the shortcut the first line actually creates (Ctrl+o)
Ord('o') or scCtrl = 16495 // wut?
// Which is invalid, cause only caps are used
ShortCutToText(16431) = ''
何が起きてる?今のところ、エラーは TextToShortCut の最後の部分にあると思います: + 記号 (この場合は「Ctrl」) の前の部分を処理した後、残りの部分 (「/」) のショートカットを見つけようとします。ただし、現在の形式では、 + の後の部分もそれ自体で有効なショートカットである必要があります。
for Key := $08 to $255 do { Copy range from table in ShortCutToText }
if AnsiCompareText(Text, ShortCutToText(Key)) = 0 then
begin
Result := Key or Shift;
Exit;
end;
その理由は次のとおりです。
ShortCutToText('/') = 0 (failure)
MapVirtualKey('/',MAPVK_VK_TO_VSC) = 0 (failure)
...ループは「/」を有効なショートカットとして検出できません。
これは VCL のバグですか、それとも何か不足していますか?
概念実証は次のとおりです (はい、コードのスクリーンショットを撮っていますが、これをコンポーネント パレットと組み合わせた方が、このコードを直接使用するよりも高速です)。
編集1:
編集2:
メニュー項目に 16431 を手動で割り当てても機能しません。