robotgo icon indicating copy to clipboard operation
robotgo copied to clipboard

Using keytap in eventhook

Open luchanghe opened this issue 4 years ago • 2 comments

  • Robotgo version (or commit ref): v0.92.1
  • Go version: go1.14.2 windows/amd64
  • Gcc version: Gcc version: gcc version 8.1.0 (x86_64-posix-sjlj-rev0, Built by MinGW-W64 project)
  • Operating system and bit:
  • Resolution:
  • Can you reproduce the bug at Examples:
    • [✔ ] Yes (provide example code)
    • [ ] No
    • [ ] Not relevant
  • Provide example code:
func main() {
	robotgo.EventHook(hook.KeyDown, []string{"w"}, func(e hook.Event) {
		fmt.Println("i tap w enter")
		robotgo.KeyTap("enter")
	})
	s := robotgo.EventStart()
	<-robotgo.EventProcess(s)
}
  • Log gist: QQ图片20210128173319

Description

在EventHook中使用keytap发生了调用多次的情况,如图所示,事实上我只按了一次w ...

luchanghe avatar Jan 28 '21 09:01 luchanghe

v0.93.1 on mac (go version 1.13.5)

func main() {
	robotgo.EventHook(hook.KeyDown, []string{"w"}, func(e hook.Event) {
		fmt.Println("i tap w enter")
		robotgo.KeyTap("enter")
	})
	s := robotgo.EventStart()
	<-robotgo.EventProcess(s)
}

will print 3 or 4 times 图片

yywing avatar Mar 05 '21 06:03 yywing

The reason is keypress delay.

Such as keydown w -> wait 300ms -> keyup w. In the 300ms, hook callback action robotgo.KeyTap("enter"), trigger EventHook(). at the same time you keydown w still. So it's endless loop until keyup w.

Try:

func main() {
	robotgo.EventHook(hook.KeyDown, []string{"w"}, func(e hook.Event) {
		fmt.Println("i tap w enter", e.String())
		time.Sleep(time.Millisecond * 150)
		robotgo.KeyTap("enter")
	})
	s := robotgo.EventStart()
	<-robotgo.EventProcess(s)
}

wilon avatar Mar 25 '21 01:03 wilon