Skip to content

Commit

Permalink
windows: add console input api
Browse files Browse the repository at this point in the history
This adds multiple functions to read, count, and discard console
input events. Using `ReadConsoleInput` instead of `ReadConsole` or
`ReadFile` is necessary to capture extended events such as window
resize, focus, and extended key and mouse events.

This also define console event types and structs.
  • Loading branch information
aymanbagabas committed Oct 21, 2024
1 parent adbb8bb commit 1ba63fc
Show file tree
Hide file tree
Showing 3 changed files with 127 additions and 0 deletions.
4 changes: 4 additions & 0 deletions windows/syscall_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,10 @@ func NewCallbackCDecl(fn interface{}) uintptr {
//sys SetConsoleOutputCP(cp uint32) (err error) = kernel32.SetConsoleOutputCP
//sys WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) = kernel32.WriteConsoleW
//sys ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) = kernel32.ReadConsoleW
//sys ReadConsoleInput(console Handle, buf *InputRecord, toread uint32, read *uint32) (err error) = kernel32.ReadConsoleInputW
//sys PeekConsoleInput(console Handle, buf *InputRecord, toread uint32, read *uint32) (err error) = kernel32.PeekConsoleInputW
//sys GetNumberOfConsoleInputEvents(console Handle, numevents *uint32) (err error) = kernel32.GetNumberOfConsoleInputEvents
//sys FlushConsoleInputBuffer(console Handle) (err error) = kernel32.FlushConsoleInputBuffer
//sys resizePseudoConsole(pconsole Handle, size uint32) (hr error) = kernel32.ResizePseudoConsole
//sys CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.CreateToolhelp32Snapshot
//sys Module32First(snapshot Handle, moduleEntry *ModuleEntry32) (err error) = kernel32.Module32FirstW
Expand Down
87 changes: 87 additions & 0 deletions windows/types_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -3474,3 +3474,90 @@ const (
KLF_NOTELLSHELL = 0x00000080
KLF_SETFORPROCESS = 0x00000100
)

// FocusEventRecord corresponds to the FocusEventRecord structure from the
// Windows console API.
// https://docs.microsoft.com/en-us/windows/console/focus-event-record-str
type FocusEventRecord struct {
// SetFocus is reserved and should not be used.
SetFocus bool
}

// KeyEventRecord corresponds to the KeyEventRecord structure from the Windows
// console API.
// https://docs.microsoft.com/en-us/windows/console/key-event-record-str
type KeyEventRecord struct {
// KeyDown specified whether the key is pressed or released.
KeyDown bool

// RepeatCount indicates that a key is being held down. For example, when a
// key is held down, five events with RepeatCount equal to 1 may be
// generated, one event with RepeatCount equal to 5, or multiple events
// with RepeatCount greater than or equal to 1.
RepeatCount uint16

// VirtualKeyCode identifies the given key in a device-independent manner
// (see
// https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes).
VirtualKeyCode uint16

// VirtualScanCode represents the device-dependent value generated by the
// keyboard hardware.
VirtualScanCode uint16

// Char is the character that corresponds to the pressed key. Char can be
// zero for some keys.
Char rune

//ControlKeyState holds the state of the control keys.
ControlKeyState uint32
}

// MenuEventRecord corresponds to the MenuEventRecord structure from the
// Windows console API.
// https://docs.microsoft.com/en-us/windows/console/menu-event-record-str
type MenuEventRecord struct {
CommandID uint32
}

// MouseEventRecord corresponds to the MouseEventRecord structure from the
// Windows console API.
// https://docs.microsoft.com/en-us/windows/console/mouse-event-record-str
type MouseEventRecord struct {
// MousePosition contains the location of the cursor, in terms of the
// console screen buffer's character-cell coordinates.
MousePositon Coord

// ButtonState holds the status of the mouse buttons.
ButtonState uint32

// ControlKeyState holds the state of the control keys.
ControlKeyState uint32

// EventFlags specify the type of mouse event.
EventFlags uint32
}

// WindowBufferSizeRecord corresponds to the WindowBufferSizeRecord structure
// from the Windows console API.
// https://docs.microsoft.com/en-us/windows/console/window-buffer-size-record-str
type WindowBufferSizeRecord struct {
// Size contains the size of the console screen buffer, in character cell
// columns and rows.
Size Coord
}

// InputRecord corresponds to the INPUT_RECORD structure from the Windows
// console API.
//
// https://docs.microsoft.com/en-us/windows/console/input-record-str
type InputRecord struct {
// EventType specifies the type of event that helt in Event.
EventType uint16

// Padding of the 16-bit EventType to a whole 32-bit dword.
_ [2]byte

// Event holds the actual event data.
Event [16]byte
}
36 changes: 36 additions & 0 deletions windows/zsyscall_windows.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 1ba63fc

Please sign in to comment.