Microsoftさんによると、keybd_event 関数ついて
>Windows NT/2000:この関数は、SendInput 関数に取って代わられています。
>この関数の代わりに SendInput を使ってください。
というわけでSendInput版も
#include "hsp3dish.as"
//入力タイプ(type)
#const INPUT_KEYBOARD 1 // キーボードイベント
//動作を指定するフラグ(dwFlags)
#const KEYEVENTF_KEYDOWN 0x0 // キーを押す
#const KEYEVENTF_KEYUP 0x2 // キーを離す
// 仮想キーコード
#const VK_MENU 0x12 // ALT
#const VK_F10 0x79 // F10
#uselib "user32.dll"
#func SendInput "SendInput" sptr, sptr, sptr
#define MapVirtualKey MapVirtualKeyA
#cfunc MapVirtualKeyA "MapVirtualKeyA" sptr, sptr
// キーイベントの事前準備
dim pInputsA, 7, 3; ALT用入力イベント登録用配列
dim pInputsF, 7, 3; F10用入力イベント登録用配列
wScanA = MapVirtualKey( VK_MENU, 0 );
wScanF = MapVirtualKey( VK_F10, 0 );
// ALT用 挿入する入力イベントの配列
pInputsA(0, 0) = INPUT_KEYBOARD, VK_MENU|(wScanA<<16), KEYEVENTF_KEYUP; ALTキー押し上げ
pInputsA(0, 1) = INPUT_KEYBOARD, VK_MENU|(wScanA<<16), KEYEVENTF_KEYDOWN; 再度ALTキー押し下げ
pInputsA(0, 2) = INPUT_KEYBOARD, VK_MENU|(wScanA<<16), KEYEVENTF_KEYUP; ALTキー押し上げ
// F10用 挿入する入力イベントの配列
pInputsF(0, 0) = INPUT_KEYBOARD, VK_F10|(wScanF<<16), KEYEVENTF_KEYUP; F10キー押し上げ
pInputsF(0, 1) = INPUT_KEYBOARD, VK_F10|(wScanF<<16), KEYEVENTF_KEYDOWN; 再度F10キー押し下げ
pInputsF(0, 2) = INPUT_KEYBOARD, VK_F10|(wScanF<<16), KEYEVENTF_KEYUP; F10キー押し上げ
nInputs = 3; // 入力イベントの数
cbSize = 7 * 4; // 構造体のサイズ
// メインループ
repeat
redraw 0;
color 255,255,255: boxf;
color 0, 0, 0: pos 0, 0;
mes cnt;
// ALT
getkey alt, VK_MENU;
if( alt ): SendInput nInputs, varptr(pInputsA), cbSize;
// F10
getkey f10, VK_F10;
if( f10 ): SendInput nInputs, varptr(pInputsF), cbSize;
redraw 1;
await 50;
loop
メインループはシンプルになりましたが、それ以前が理解しにくいですね。