GetKeyNameText を使うには?

解決


ユーロ140  2008-10-07 04:04:03  No: 32142

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;


単純ミス  2008-10-07 05:25:38  No: 32143

エラーになるのは、名前を入れるKeyNameのメモリ領域が確保されてないから。


ユーロ140  2008-10-07 09:13:56  No: 32144

WIN APIで使うPCharはメモリ確保しないといけないことを忘れてました。
KeyName: array[0..255] of Char; にしたら動きました。
単純ミス様ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加