INASOFT 管理人のひとこと


フリーソフトダウンロードサイト「INASOFT」の管理人 矢吹拓也 が日々の「ひとこと」を語るページです。
2021年1月1日より、旧ブログ(blog.inasoft.org)からお引越ししました。
・INASOFT Webサイト: https://www.inasoft.org/
・管理人のふたこと(長文記事/寄稿文): https://www.inasoft.org/talk/
2022年7月下旬より再び本業多忙化してきているため、更新頻度は落ちます。 [2022/7/24 19:32]

目次 | ←前へ / 2026-02-21 00:00

■仮想キーコードの定義を丸っとスクリプト仕様に取り込んだので、動作速度が落ちるかもしれない対策

2026年 2月21日(土) 0:00:00



RSSRSS配信中
https://www.inasoft.org/



先週、FR-Scriptの組込関数に、キーボード押下をシミュレーションするためのKeybdEvent()を追加したのを受けて、Windowsの仮想キーコードの定数値についても「初期代入変数」に追加しました。

その結果、これまで、実装実験の際に追加していた2つだけだった初期代入変数( Yes = 1, isNT = 1 )が、162個に増加しました。

↓追加した定数

特殊指定仮想キーコード意味
VK_BACK0x08BackSpaceキー
VK_TAB0x09Tabキー
VK_CLEAR0x0CClearキー
VK_RETURN0x0DEnterキー
VK_SHIFT0x10シフトキー
VK_CONTROL0x11Ctrlキー
VK_MENU0x12Altキー
VK_PAUSE0x13Pauseキー
VK_CAPITAL0x14CapsLockキー
VK_KANA0x15IME カナモード
VK_HANGEUL0x15IME Hanguel mode (maintained for compatibility; use VK_HANGUL)
VK_HANGUL0x15IME Hangul mode
VK_JUNJA0x17IME Junja mode
VK_FINAL0x18IME final mode
VK_HANJA0x19IME Hanja mode
VK_KANJI0x19IME 漢字モード
VK_ESCAPE0x1BEscキー
VK_CONVERT0x1CIME変換
VK_NONCONVERT0x1DIME無変換
VK_ACCEPT0x1EIME accept
VK_MODECHANGE0x1FIME mode change request
VK_SPACE0x20スペースキー
VK_PRIOR0x21Page Upキー
VK_NEXT0x22Page Downキー
VK_END0x23Endキー
VK_HOME0x24Homeキー
VK_LEFT0x25カーソルキー左
VK_UP0x26カーソルキー上
VK_RIGHT0x27カーソルキー右
VK_DOWN0x28カーソルキー下
VK_SELECT0x29Selectキー
VK_PRINT0x2APrintキー
VK_EXECUTE0x2BExecuteキー
VK_SNAPSHOT0x2CPrint Screenキー
VK_INSERT0x2DInsertキー
VK_DELETE0x2EDeleteキー
VK_HELP0x2FHelpキー
VK_LWIN0x5B左Windowsキー
VK_RWIN0x5C右Windowsキー
VK_APPS0x5Dアプリケーションキー
VK_SLEEP0x5Fスリープキー
VK_NUMPAD00x60テンキー0
VK_NUMPAD10x61テンキー1
VK_NUMPAD20x62テンキー2
VK_NUMPAD30x63テンキー3
VK_NUMPAD40x64テンキー4
VK_NUMPAD50x65テンキー5
VK_NUMPAD60x66テンキー6
VK_NUMPAD70x67テンキー7
VK_NUMPAD80x68テンキー8
VK_NUMPAD90x69テンキー9
VK_MULTIPLY0x6A*キー
VK_ADD0x6B+キー
VK_SEPARATOR0x6CSeparator key
VK_SUBTRACT0x6D-キー
VK_DECIMAL0x6E. キー
VK_DIVIDE0x6F/キー
VK_F10x70F1キー
VK_F20x71F2キー
VK_F30x72F3キー
VK_F40x73F4キー
VK_F50x74F5キー
VK_F60x75F6キー
VK_F70x76F7キー
VK_F80x77F8キー
VK_F90x78F9キー
VK_F100x79F10キー
VK_F110x7AF11キー
VK_F120x7BF12キー
VK_F130x7CF13キー
VK_F140x7DF14キー
VK_F150x7EF15キー
VK_F160x7FF16キー
VK_F170x80F17キー
VK_F180x81F18キー
VK_F190x82F19キー
VK_F200x83F20キー
VK_F210x84F21キー
VK_F220x85F22キー
VK_F230x86F23キー
VK_F240x87F24キー
VK_NUMLOCK0x90NumLockキー
VK_SCROLL0x91ScrollLockキー
VK_OEM_NEC_EQUAL0x92OEM定義キー
VK_OEM_FJ_JISHO0x92OEM定義キー
VK_OEM_FJ_MASSHOU0x93OEM定義キー
VK_OEM_FJ_TOUROKU0x94OEM定義キー
VK_OEM_FJ_LOYA0x95OEM定義キー
VK_OEM_FJ_ROYA0x96OEM定義キー
VK_LSHIFT0xA0左シフトキー
VK_RSHIFT0xA1右シフトキー
VK_LCONTROL0xA2左Ctrlキー
VK_RCONTROL0xA3右Ctrlキー
VK_LMENU0xA4左Altキー
VK_RMENU0xA5右Altキー
VK_BROWSER_BACK0xA6ブラウザ戻るキー
VK_BROWSER_FORWARD0xA7ブラウザ進むキー
VK_BROWSER_REFRESH0xA8ブラウザ更新キー
VK_BROWSER_STOP0xA9ブラウザ停止キー
VK_BROWSER_SEARCH0xAAブラウザサーチキー
VK_BROWSER_FAVORITES0xABブラウザお気に入りキー
VK_BROWSER_HOME0xACブラウザHomeキー
VK_VOLUME_MUTE0xADボリューム無音キー
VK_VOLUME_DOWN0xAEボリューム低下キー
VK_VOLUME_UP0xAFボリューム上昇キー
VK_MEDIA_NEXT_TRACK0xB0メディア次トラックキー
VK_MEDIA_PREV_TRACK0xB1メディア前トラックキー
VK_MEDIA_STOP0xB2メディア停止キー
VK_MEDIA_PLAY_PAUSE0xB3メディア再生/一時停止キー
VK_LAUNCH_MAIL0xB4メール起動キー
VK_LAUNCH_MEDIA_SELECT0xB5メディア選択キー
VK_LAUNCH_APP10xB6起動キー1
VK_LAUNCH_APP20xB7起動キー2
VK_OEM_10xBAOEM定義(;:*等)キー
VK_OEM_PLUS0xBBOEM定義(;+等)キー
VK_OEM_COMMA0xBCOEM定義(,<等)キー
VK_OEM_MINUS0xBDOEM定義(-=等)キー
VK_OEM_PERIOD0xBEOEM定義(.>等)キー
VK_OEM_20xBFOEM定義(/?等)キー
VK_OEM_30xC0OEM定義(~@`等)キー
VK_OEM_40xDBOEM定義([{)キー
VK_OEM_50xDCOEM定義(\|)キー
VK_OEM_60xDDOEM定義(]})キー
VK_OEM_70xDEOEM定義('"^~)キー
VK_OEM_80xDFOEM定義キー
VK_OEM_AX0xE1OEM定義キー
VK_OEM_1020xE2OEM定義(_等)キー
VK_ICO_HELP0xE3?
VK_ICO_000xE4?
VK_PROCESSKEY0xE5IME PROCESS key
VK_ICO_CLEAR0xE6?
VK_PACKET0xE7詳細はMSDN参照
VK_OEM_RESET0xE9OEM定義キー
VK_OEM_JUMP0xEAOEM定義キー
VK_OEM_PA10xEBOEM定義キー
VK_OEM_PA20xECOEM定義キー
VK_OEM_PA30xEDOEM定義キー
VK_OEM_WSCTRL0xEEOEM定義キー
VK_OEM_CUSEL0xEFOEM定義キー
VK_OEM_ATTN0xF0OEM定義キー
VK_OEM_FINISH0xF1OEM定義キー
VK_OEM_COPY0xF2OEM定義キー
VK_OEM_AUTO0xF3OEM定義キー
VK_OEM_ENLW0xF4OEM定義キー
VK_OEM_BACKTAB0xF5OEM定義キー
VK_ATTN0xF6Attn key
VK_CRSEL0xF7CrSel key
VK_EXSEL0xF8ExSel key
VK_EREOF0xF9Erase EOF key
VK_PLAY0xFAPlay key
VK_ZOOM0xFBZoom key
VK_NONAME0xFCReserved
VK_PA10xFDPA1 key
VK_OEM_CLEAR0xFEClear key
VK_LBUTTON0x01マウスの左ボタン
VK_RBUTTON0x02マウスの右ボタン
VK_CANCEL0x03Ctrl+Break処理
VK_MBUTTON0x043ボタンマウスの真ん中ボタン
VK_XBUTTON10x05マウスのX1ボタン
VK_XBUTTON20x06マウスのX2ボタン

変数の実装は、Geminiが作ってくれた C++の std::map<std::string, value> で実装していて、当初は、どうせ2個しかないし、通常の変数代入時と同じく g_context.variables["YES"] = 1; とか g_context.variables["ISNT"] = 1; とかで準備していました。

ただ、162個となると、数ミリ秒くらいかかってしまうかもしれない。想定されるたいていのスクリプトでは、162個の初期代入変数のうち、使うのはせいぜい0個なので、そのために数ミリ秒もかかってしまうのは許し難い(※1)。というわけで、ちょっとでも効率を高めるために、策を講じることにしました。

(※1) … 現実としてはこうなのだが、スクリプトのインタプリタ実装の一般論として、変数アクセスはこの方式で行いたいというのもあり、あえてこのままでやってます。これがコンパイル言語ならば、#defineみたいなので数値定数に置き換えちゃうんだろうから、実行時の負荷にならない実装が可能なんですよね。

std::mapは、読み取りアクセスの時の高速性に主眼が置かれているはずで、要素挿入時はむしろ時間を食うかと思います。メモリ確保と、ソート順維持のための並べ替え(あるいは挿入)が生じるはずなので。読み取りアクセス前に、あらかじめソートされていることが、std::mapをクエリするときの高速性につながるので。

というわけで、初期代入変数の追加順を、変数名(キー)の昇順になるようにし、

g_context.variables.emplace(std::make_pair("ISNT", 1));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_0", 0x30));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_1", 0x31));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_2", 0x32));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_3", 0x33));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_4", 0x34));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_5", 0x35));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_6", 0x36));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_7", 0x37));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_8", 0x38));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_9", 0x39));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_A", 0x41));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_ACCEPT", 0x1E));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_ADD", 0x6B));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_APPS", 0x5D));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_ATTN", 0xF6));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_B", 0x42));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_BACK", 0x08));
  :
  :
  :
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_SPACE", 0x20));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_SUBTRACT", 0x6D));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_T", 0x54));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_TAB", 0x09));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_U", 0x55));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_UP", 0x26));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_V", 0x56));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_VOLUME_DOWN", 0xAE));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_VOLUME_MUTE", 0xAD));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_VOLUME_UP", 0xAF));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_W", 0x57));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_X", 0x58));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_XBUTTON1", 0x05));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_XBUTTON2", 0x06));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_Y", 0x59));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_Z", 0x5A));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("VK_ZOOM", 0xFB));
g_context.variables.emplace_hint(g_context.variables.end(), std::make_pair("YES", 1));

とするようにしました。

std::map::emplace()std::map::emplace_hint()って、今回初めて使ってみたんですが、使い方合ってるかな。

ところでどうでもいい話なのですが、仮想キーコードの押し/離しについて、キーボードシミュレータのサブメニューへの追加プログラムを書いていたら、プログラムのコメントに【押しの子】が出てきてしまった。(漢字が違うけど)



目次 | ←前へ / 2026-02-21 00:00


目次の表示:


ブログではないので、コメント機能とトラックバック機能は提供していません。ご質問・ご意見等はメールフィードバックまたはX等からお願いします。いただいたご質問・ご意見などは、この「管理人のひとこと」の記事に追加、あるいは新規の記事にする形で一部または全文をそのまま、あるいは加工させていただいた上で、ご紹介させていただく場合があります。
当サイトでは掲載内容による不具合等に関する責任を持ちません。また、内容の正確性についての保証もありませんので、情報をご利用の際は、利用者の自己責任で確認をお願いします。本ページは公開から1年半後の任意のタイミングで削除される予定です。


- 最近の更新 -



3468723 (+0176)[+1980]

Copyright© 2010-2026 INASOFT