查询获取键盘按键所需要用到的Protocol
EFI_INPUT_KEY用来存储按键信息
那我们开始操作了,以下是示例代码
EFI_STATUS
EFIAPI
MainEntryPoint (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable )
{
EFI_STATUS Status;
UINTN Index = 0;
UINTN InputIndex = 0;
CHAR16 InputKey[256];
EFI_INPUT_KEY Key;
EFI_SIMPLE_TEXT_INPUT_PROTOCOL *ConIn;
//查询Handler是否支持指定的Protocol
Status = gBS->HandleProtocol (
gST->ConsoleInHandle,
&gEfiSimpleTextInProtocolGuid,
(VOID*)&ConIn);
if (EFI_ERROR(Status)) {
return Status;
}
//打印要输入按键的提示
gST->ConOut->OutputString(gST->ConOut, L"please press any key\n\r");
while (TRUE)
{
//等待用户按下按键
gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &Index);
//读取到用户按下的按键并传值到变量Key
Status = ConIn->ReadKeyStroke (ConIn, &Key);
//按回车键结束
if (Key.UnicodeChar == L'\r')
{
gST->ConOut->OutputString(gST->ConOut, L"\n\r");
break;
}
//将用户按下的按键字符遍历组合成字符串
InputKey[InputIndex++] = Key.UnicodeChar;
//打印用户按下的按键
gST->ConOut->OutputString(gST->ConOut, &Key.UnicodeChar);
}
//以空字符结束
InputKey[InputIndex] = '\0';
//打印输入完的字符串
gST->ConOut->OutputString(gST->ConOut, InputKey);
return EFI_SUCCESS;
}
在Shell下运行