通過寄存器 _AX, _BX, _CX, _DX 調用 int 0x33 實現鼠標操作。常用功能:
_AX=0:復位/檢測驅動。_AX=1:顯示光標。_AX=2:隱藏光標。_AX=3:獲取狀態與座標(_BX 按鍵,_CX/_DX X/Y)。_AX=4:設置光標位置。_AX=7/8:設置水平/垂直範圍限制。int LeftPress() { _AX=3; geninterrupt(0x33); return _BX & 1; }
int RightPress() { _AX=3; geninterrupt(0x33); return _BX & 2; }
void MouseGetXY() { _AX=3; geninterrupt(0x33); MouseX=_CX; MouseY=_DX; }
while(1) {
if (LeftPress()) { MouseGetXY(); printf("Left at (%d,%d)\n", MouseX, MouseY); sleep(1); }
if (RightPress()) { MouseGetXY(); printf("Right at (%d,%d)\n", MouseX, MouseY); sleep(1); }
if (kbhit() && bioskey(0)==0x011b) break; // ESC 退出
}
問題: 未加 sleep(1) 時,單次點擊觸發多次打印。
原因: 輪詢速度極快,鼠標按下狀態持續多個循環迭代。
解決: 處理完畢後 sleep(1) 或標記狀態等待釋放。
TC 無原生多線程庫,僅能靠輪詢模擬並發。若需真多線程,建議遷移至現代編譯器(如 GCC/Clang)配合 pthreads 或 Windows API。