src.elv.sh@v0.21.0-dev.0.20240515223629-06979efb9a2a/pkg/sys/ewindows/console.go (about) 1 //go:build windows 2 3 package ewindows 4 5 import ( 6 "unsafe" 7 8 "golang.org/x/sys/windows" 9 ) 10 11 // https://docs.microsoft.com/en-us/windows/console/readconsoleinput 12 // 13 // BOOL WINAPI ReadConsoleInput( 14 // 15 // _In_ HANDLE hConsoleInput, 16 // _Out_ PINPUT_RECORD lpBuffer, 17 // _In_ DWORD nLength, 18 // _Out_ LPDWORD lpNumberOfEventsRead 19 // ); 20 var readConsoleInput = kernel32.NewProc("ReadConsoleInputW") 21 22 // ReadConsoleInput input wraps the homonymous Windows API call. 23 func ReadConsoleInput(h windows.Handle, buf []InputRecord) (int, error) { 24 var nr uintptr 25 r, _, err := readConsoleInput.Call(uintptr(h), 26 uintptr(unsafe.Pointer(&buf[0])), uintptr(len(buf)), uintptr(unsafe.Pointer(&nr))) 27 if r != 0 { 28 err = nil 29 } 30 return int(nr), err 31 } 32 33 // InputEvent is either a KeyEvent, MouseEvent, WindowBufferSizeEvent, 34 // MenuEvent or FocusEvent. 35 type InputEvent interface { 36 isInputEvent() 37 } 38 39 func (*KeyEvent) isInputEvent() {} 40 func (*MouseEvent) isInputEvent() {} 41 func (*WindowBufferSizeEvent) isInputEvent() {} 42 func (*MenuEvent) isInputEvent() {} 43 func (*FocusEvent) isInputEvent() {} 44 45 // GetEvent converts InputRecord to InputEvent. 46 func (input *InputRecord) GetEvent() InputEvent { 47 switch input.EventType { 48 case KEY_EVENT: 49 return (*KeyEvent)(unsafe.Pointer(&input.Event)) 50 case MOUSE_EVENT: 51 return (*MouseEvent)(unsafe.Pointer(&input.Event)) 52 case WINDOW_BUFFER_SIZE_EVENT: 53 return (*WindowBufferSizeEvent)(unsafe.Pointer(&input.Event)) 54 case MENU_EVENT: 55 return (*MenuEvent)(unsafe.Pointer(&input.Event)) 56 case FOCUS_EVENT: 57 return (*FocusEvent)(unsafe.Pointer(&input.Event)) 58 default: 59 return nil 60 } 61 }