屏幕显示功能搭配取按键信息的功能可以实现一个简单的菜单,用户可以使用上下键移动后选项,回车确认,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
完整的代码下载: