KeyDownのKeyには押されたキーコードが入っていますが、
これから文字を取得することは可能でしょうか。
文字→キーコードはOrdで取得できますけど、その逆をしたいのです。
ShowMessage(IntToHex(word('A'),2));
ShowMessage(IntToHex(Ord('A'),2));
41
と表示されます
ShowMessage(Char(StrToInt('$41')));
ShowMessage(Char($41));
ShowMessage(Chr($41));
どれでも
A
と表示されます。
私も同じようなことを考えたことがあります。
ホットキーを登録するソフトで、
ShiftとかF1とかも押された場合にも
キーネームを得る方法。
そのときのコードが参考になれば幸いです。
///////////////////////////////////////////////////////////
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
strMod : string;
Key_Name : array[0..100] of char;
lParam : Integer ;
begin
{RegisterHotKeyに渡すバーチャルキーコード}
vk := Key ;
{RegisterHotKeyに渡す特殊キー情報の変換}
fsModifiers := 0;
if ssShift in Shift then
begin
fsModifiers := fsModifiers + MOD_SHIFT; // +4
end;
if ssAlt in Shift then
begin
fsModifiers := fsModifiers + MOD_ALT; // +1
end;
if ssCtrl in Shift then
begin
fsModifiers := fsModifiers + MOD_CONTROL; // +2
end;
{表示処理部分}
case fsModifiers of
1: strMod := 'Alt + ';
2: strMod := 'Ctrl + ';
4: strMod := 'Shift + ';
3: strMod := 'Ctrl + Alt + ';
5: strMod := 'Shift + Alt + ';
6: strMod := 'Ctrl + Shift + ';
7: strMod := 'Ctrl + Shift + Alt + ';
else
strMod := '';
end;
{バーチャルキーコードをスキャンコードに変換してからキーネームを得る}
lParam := MapVirtualKey(Key, 0) shl 16 ;
case Key of // lParamの0から数えて24番目のビットがExtended-Key Flag
33..46,91..93,108,111,144,163,165: lParam := lParam + $1000000 ;
// Page Up...LEFT,UP,RIGHT,DOWN...Delete,,Windowsなどなど
end;
GetKeyNameText(lParam, @Key_Name, 100); //Key_Namewを得る
KeyNameStr := String(Key_Name); //Ctrl + Ctrl みたいになるのを防ぐ
if KeyNameStr = 'Ctrl' then
begin
KeyNameStr := '';
end;
if KeyNameStr = 'Shift' then
begin
KeyNameStr := '';
end;
if KeyNameStr = 'Alt' then
begin
KeyNameStr := '';
end;
Edit1.Text := ( strMod + KeyNameStr ) ; //表示
end;
///////////////////////////////////////////////////////////
Fusaさん、QUEBitsさん、ありがとうございました。
参考になります。丁度ホットキー関係の処理をしていたもので。
ツイート | ![]() |