Virtual-Key Codes から MapVirtualKey GetKeyNameText を使ってキーの名前を取得しようとしているのですが、
以下のコードを実行すると
Access violation at address 7C952F39 in module 'ntdll.dll'. Write of address 0044F61C.
というエラーで失敗します。どこが間違っているのでしょうか?
環境:winxpsp3 delphi7
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
KeyScanCode : Integer;
KeyName: PChar;
begin
KeyScanCode := MapVirtualKeyEx(Key, 0, GetKeyboardLayout(0)) shl 16;
case Key of
// Extended-Key Flag
33..46,91..93,108,111,144,163,165: KeyScanCode := KeyScanCode + $1000000;
end;
KeyName := '';
if GetKeyNameText(KeyScanCode, KeyName, 128) > 0 then
begin
Memo1.Lines.Add( Format('VK=%.2x Name=%s',[Key, KeyName]) );
end;
end;
エラーになるのは、名前を入れるKeyNameのメモリ領域が確保されてないから。
WIN APIで使うPCharはメモリ確保しないといけないことを忘れてました。
KeyName: array[0..255] of Char; にしたら動きました。
単純ミス様ありがとうございました。
ツイート | ![]() |