屏幕显示功能搭配取按键信息的功能可以实现一个简单的菜单,用户可以使用上下键移动后选项,回车确认,ESC退出。
代码本身不复杂
#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/ShellCEntryLib.h>
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <time.h>
#include <Protocol/EfiShell.h>
#include <Library/ShellLib.h>
#include <Protocol/SimpleFileSystem.h>
#include <Protocol/BlockIo.h>
#include <Library/DevicePathLib.h>
#include <Library/HandleParsingLib.h>
#include <Library/SortLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/BaseMemoryLib.h>
extern EFI_BOOT_SERVICES *gBS;
extern EFI_SYSTEM_TABLE *gST;
extern EFI_RUNTIME_SERVICES *gRT;
extern EFI_SHELL_ENVIRONMENT2 *mEfiShellEnvironment2;
extern EFI_HANDLE gImageHandle;
//
// EFI Scan codes
// copied from \EdkCompatibilityPkg\Foundation\Efi\Protocol\SimpleTextIn\SimpleTextIn.h
//
#define SCAN_NULL 0x0000
#define SCAN_UP 0x0001
#define SCAN_DOWN 0x0002
#define SCAN_ESC 0x0017
#define CHAR_CARRIAGE_RETURN 0x000D
#define POSX 7
#define POSY 3
#define NUM 5
CHAR16 HELPSTR[40]=L"UP/DOWN, ENTER , ESC";
CHAR16 ITEM[NUM][20]= {
L"Item1 MOVSXX",
L"Item2 CPUID",
L"Item3 RETF",
L"Item4 PUSHF",
L"Item5 SUB"
};
int
EFIAPI
main (
IN int Argc,
IN char **Argv
)
{
EFI_INPUT_KEY Key;
EFI_STATUS Status;
int current=0;
int i;
gST -> ConOut ->ClearScreen(gST->ConOut);
ShellPrintEx(POSX-3,POSY-1,L"%N%S",HELPSTR);
ShellPrintEx(POSX,POSY,L"%H%S",ITEM[0]);
for (i=1;i<NUM;i++)
{
ShellPrintEx(POSX,POSY+i,L"%N%S",ITEM[i]);
}
Key.ScanCode=SCAN_NULL;
while (SCAN_ESC!=Key.ScanCode)
{
Status= gST -> ConIn -> ReadKeyStroke(gST->ConIn,&Key);
if (Status == EFI_SUCCESS) {
ShellPrintEx(POSX,POSY+current,L"%N%S",ITEM[current]);
if (SCAN_UP == Key.ScanCode) {current = (current-1+NUM)%NUM;}
if (SCAN_DOWN == Key.ScanCode) {current = (current+1)%NUM;}
ShellPrintEx(POSX,POSY+current,L"%H%S",ITEM[current]);
ShellPrintEx(POSX,POSY+NUM,L"Current[%d] Scancode[%d] UnicodeChar[%x] \n\r",current,Key.ScanCode,Key.UnicodeChar);
}
if (CHAR_CARRIAGE_RETURN == Key.UnicodeChar) {
ShellPrintEx(POSX,POSY+NUM+1,L"You have chosen: %N%S",ITEM[current]);
break;
}
};
return EFI_SUCCESS;
}
运行结果:
工作视频:
http://www.tudou.com/programs/view/R_932wqGuYw/?resourceId=414535982_06_02_99
完整的代码下载:






























