diff --git a/pkg/keyboard/keyboard_windows.go b/pkg/keyboard/keyboard_windows.go index 850deb8..4c647ec 100644 --- a/pkg/keyboard/keyboard_windows.go +++ b/pkg/keyboard/keyboard_windows.go @@ -67,25 +67,31 @@ func (k keyboardWindows) Events(ctx context.Context) (chan Event, error) { k.eventChan = make(chan Event) go func() { hookCallback := syscall.NewCallback(func(nCode int, wParam, lParam uintptr) uintptr { - if nCode >= 0 { - kbStruct := (*kbDLLHOOKSTRUCT)(unsafe.Pointer(lParam)) + select { + case <-ctx.Done(): + return 0 - var eventType EventType = KeyboardEventTypeDown - if kbStruct.Flags == flagKeyUp { - eventType = KeyboardEventTypeUp - } + default: + if nCode >= 0 { + kbStruct := (*kbDLLHOOKSTRUCT)(unsafe.Pointer(lParam)) - event := Event{ - Key: key.FindKeyCode(kbStruct.VKCode), - EventType: eventType, - Timestamp: parseTime(kbStruct.Time), + var eventType EventType = KeyboardEventTypeDown + if kbStruct.Flags == flagKeyUp { + eventType = KeyboardEventTypeUp + } + + event := Event{ + Key: key.FindKeyCode(kbStruct.VKCode), + EventType: eventType, + Timestamp: parseTime(kbStruct.Time), + } + + k.eventChan <- event } - k.eventChan <- event + r1, _, _ := procCallNextHookEx.Call(0, uintptr(nCode), wParam, lParam) + return r1 } - - r1, _, _ := procCallNextHookEx.Call(0, uintptr(nCode), wParam, lParam) - return r1 }) h, _, _ := procSetWindowsHookEx.Call(uintptr(keyboardHook), hookCallback, 0, 0)