許多嵌入式儀器僅有少數實體按鈕,卻需輸入大量參數 (藥名、速度、壓力等)。若能透過除錯埠讓 PC 模擬滑鼠鍵盤,將大幅簡化輸入流程。本文實作一套 虛擬輸入代理層,包含 MFDeploy 外掛、TinyCLR 核心修改、事件驅動機制、WinForms 輸入代理。
利用既有 WriteMemory 通道,將滑鼠/鍵盤事件封裝為 8 位元組封包寫入特定位址 0xD:
// 鍵盤封包: 0x01, State, KeyCode, KeyValue, Shift, Caps, Ins, 0
// 滑鼠封包: 0x02, State, LeftBtn, RightBtn, X_Hi, X_Lo, Y_Hi, Y_Lo
private void SendData(byte[] bytData) {
byte[] TempData = new byte[10] {0xAA, 0x55,0,0,0,0,0,0,0,0};
Array.Copy(bytData, 0, TempData, 2, 8);
engine.WriteMemory(0xD, TempData, 0, 10);
}
表單大小自動配合裝置 LCD 解析度,形成等大的滑鼠活動區。
修改 Debugger.cpp 中 CLR_DBG_Debugger::AccessMemory 的 AccessMemory_Write 分支:
case AccessMemory_Write:
if (accessAddress == 0xD && NumOfBytes==10 && bufPtr[0]==0xAA && bufPtr[1]==0x55) {
UINT32 data1 = (bufPtr[2]<<24)|(bufPtr[3]<<16)|(bufPtr[4]<<8)|bufPtr[5];
UINT32 data2 = (bufPtr[6]<<24)|(bufPtr[7]<<16)|(bufPtr[8]<<8)|bufPtr[9];
VI_GenerateEvent(data1, data2); // 觸發事件
success = TRUE;
} else { /* 原本寫入邏輯 */ }
break;
於 \DeviceCode\PAL\VirtualInput 實作標準 CLR_RT_DriverInterruptMethods:
VI_GenerateEvent 將封包存入 HAL 佇列 (SaveNativeEventToHALQueue)。g_CLR_AssemblyNative_Microsoft_SPOT_YFVI_Event 組件資料,名稱需與 Managed 端一致。EventDispatcher 繼承 NativeEventDispatcher,建構子傳入 "Microsoft_SPOT_YFVI_Event"。eventDispatcher_OnInterrupt 解析 data1/data2 還原鍵盤/滑鼠參數,呼叫 SendKey/SendMouse。Application.InputProxy.VirtualInputEnable = true;。Custom 通道已整合滑鼠鍵盤與檔案系統指令。