From a7853101e4271c744e3962d8436ed9644097cf79 Mon Sep 17 00:00:00 2001 From: senro Date: Fri, 14 Sep 2018 17:38:43 +0800 Subject: [PATCH] complete add event listener demo --- cdeps/hook/windows/hook_c.h | 2 + event/goEvent.h | 132 ++++++------------------------------ event/pub.h | 4 +- eventTest/eventTest.go | 32 +++++++++ eventTest/exportFunc.go | 23 +++++++ examples/event/main.go | 61 ----------------- writeTest.txt | 1 + 7 files changed, 81 insertions(+), 174 deletions(-) create mode 100644 eventTest/eventTest.go create mode 100644 eventTest/exportFunc.go delete mode 100644 examples/event/main.go create mode 100644 writeTest.txt diff --git a/cdeps/hook/windows/hook_c.h b/cdeps/hook/windows/hook_c.h index ed15515..210252f 100644 --- a/cdeps/hook/windows/hook_c.h +++ b/cdeps/hook/windows/hook_c.h @@ -712,6 +712,8 @@ IOHOOK_API int hook_run() { while (GetMessage(&message, (HWND) NULL, 0, 0) > 0) { TranslateMessage(&message); DispatchMessage(&message); + + printf("&message: %s",&message); } } else { diff --git a/event/goEvent.h b/event/goEvent.h index f01c3ad..cee1d85 100644 --- a/event/goEvent.h +++ b/event/goEvent.h @@ -19,148 +19,58 @@ #include "pub.h" - void dispatch_proc(iohook_event * const event) { - char buffer[256] = { 0 }; - size_t length = snprintf(buffer, sizeof(buffer), - "id=%i,when=%" PRIu64 ",mask=0x%X", - event->type, event->time, event->mask); + + int keycode; switch (event->type) { case EVENT_KEY_PRESSED: // If the escape key is pressed, naturally terminate the program. if (event->data.keyboard.keycode == VC_ESCAPE) { - // int status = hook_stop(); - // switch (status) { - // // System level errors. - // case IOHOOK_ERROR_OUT_OF_MEMORY: - // loggerProc(LOG_LEVEL_ERROR, "Failed to allocate memory. (%#X)", status); - // break; - // case IOHOOK_ERROR_X_RECORD_GET_CONTEXT: - // // NOTE This is the only platform specific error that occurs on hook_stop(). - // loggerProc(LOG_LEVEL_ERROR, "Failed to get XRecord context. (%#X)", status); - // break; - - // // Default error. - // case IOHOOK_FAILURE: - // default: - // loggerProc(LOG_LEVEL_ERROR, "An unknown hook error occurred. (%#X)", status); - // break; - // } } case EVENT_KEY_RELEASED: - snprintf(buffer + length, sizeof(buffer) - length, - ",keycode=%u,rawcode=0x%X", - event->data.keyboard.keycode, event->data.keyboard.rawcode); - int akeyCode = (uint16_t) event->data.keyboard.keycode; - if (event->data.keyboard.keycode == VC_ESCAPE - && atoi(cevent) == 11) { - int stopEvent = stop_event(); - // printf("stop_event%d\n", stopEvent); - cstatus = 0; - } + keycode = (int) event->data.keyboard.keycode; + //printf("EVENT_KEY_RELEASED:%d\n", keycode); + showKeyCode(keycode); + //callback(keycode); - // printf("atoi(str)---%d\n", atoi(cevent)); - if (akeyCode == atoi(cevent)) { - int stopEvent = stop_event(); - // printf("%d\n", stopEvent); - cstatus = 0; - } break; case EVENT_KEY_TYPED: - snprintf(buffer + length, sizeof(buffer) - length, - ",keychar=%lc,rawcode=%u", - (uint16_t) event->data.keyboard.keychar, - event->data.keyboard.rawcode); - - #ifdef WE_REALLY_WANT_A_POINTER - char *buf = malloc (6); - #else - char buf[6]; - #endif - sprintf(buf, "%lc", (uint16_t) event->data.keyboard.keychar); + keycode = (int) event->data.keyboard.keycode; + //printf("EVENT_KEY_TYPED:%d\n", keycode); - #ifdef WE_REALLY_WANT_A_POINTER - free (buf); - #endif - - if (strcmp(buf, cevent) == 0) { - int stopEvent = stop_event(); - // printf("%d\n", stopEvent); - cstatus = 0; - } - // return (char*) event->data.keyboard.keychar; - break; - - case EVENT_MOUSE_PRESSED: - case EVENT_MOUSE_RELEASED: - case EVENT_MOUSE_CLICKED: - case EVENT_MOUSE_MOVED: - case EVENT_MOUSE_DRAGGED: - snprintf(buffer + length, sizeof(buffer) - length, - ",x=%i,y=%i,button=%i,clicks=%i", - event->data.mouse.x, event->data.mouse.y, - event->data.mouse.button, event->data.mouse.clicks); - - int abutton = event->data.mouse.button; - int aclicks = event->data.mouse.clicks; - int amouse = -1; - - if (strcmp(cevent, "mleft") == 0) { - amouse = 1; - } - if (strcmp(cevent, "mright") == 0) { - amouse = 2; - } - if (strcmp(cevent, "wheelDown") == 0) { - amouse = 4; - } - if (strcmp(cevent, "wheelUp") == 0) { - amouse = 5; - } - if (strcmp(cevent, "wheelLeft") == 0) { - amouse = 6; - } - if (strcmp(cevent, "wheelRight") == 0) { - amouse = 7; - } - if (abutton == amouse && aclicks == 1) { - int stopEvent = stop_event(); - cstatus = 0; - } - - break; - - case EVENT_MOUSE_WHEEL: - snprintf(buffer + length, sizeof(buffer) - length, - ",type=%i,amount=%i,rotation=%i", - event->data.wheel.type, event->data.wheel.amount, - event->data.wheel.rotation); break; default: break; } - - // fprintf(stdout, "----%s\n", buffer); } -int add_event(char *key_event) { - // (uint16_t *) - cevent = key_event; +int add_event_listener() { + + printf("start C add_event\n"); + + // Set the logger callback for library output. + printf("start C hookSetlogger\n"); + hookSetlogger(&loggerProc); + printf("start C hook_set_dispatch_proc\n"); // Set the event callback for IOhook events. hook_set_dispatch_proc(&dispatch_proc); + + printf("start C hook_run\n"); // Start the hook and block. // NOTE If EVENT_HOOK_ENABLED was delivered, the status will always succeed. int status = hook_run(); + printf("hook_run status:%d\n", status); + switch (status) { case IOHOOK_SUCCESS: // Everything is ok. @@ -228,8 +138,6 @@ int add_event(char *key_event) { break; } - // return status; - // printf("%d\n", status); return cstatus; } diff --git a/event/pub.h b/event/pub.h index d58218b..68d9af5 100644 --- a/event/pub.h +++ b/event/pub.h @@ -49,9 +49,11 @@ int rrevent; // uint16_t *cevent; int cstatus = 1; +typedef int (*fnc2)(int); // 回调函数的名称为 fnc2,参数是 char *str +extern int showKeyCode(int s ); int stop_event(); -int add_event(char *key_event); +int add_event_listener(); // int allEvent(char *key_event); int allEvent(char *key_event, int vcode[], int size); diff --git a/eventTest/eventTest.go b/eventTest/eventTest.go new file mode 100644 index 0000000..374aeca --- /dev/null +++ b/eventTest/eventTest.go @@ -0,0 +1,32 @@ +// Copyright 2016 The go-vgo Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// https://github.com/go-vgo/robotgo/blob/master/LICENSE +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +package main +/* +#cgo LDFLAGS: -L ../event/ +#include +#include +#include "../event/goEvent.h" +*/ +import "C" + +func event() { + //////////////////////////////////////////////////////////////////////////////// + // Global event listener + //////////////////////////////////////////////////////////////////////////////// + + C.add_event_listener() + // stop AddEvent + // StopEvent() +} + +func main() { + event() +} diff --git a/eventTest/exportFunc.go b/eventTest/exportFunc.go new file mode 100644 index 0000000..d91af39 --- /dev/null +++ b/eventTest/exportFunc.go @@ -0,0 +1,23 @@ +// Copyright 2016 The go-vgo Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// https://github.com/go-vgo/robotgo/blob/master/LICENSE +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +package main + +import "C" +import ( + "fmt" +) + +//export showKeyCode +func showKeyCode(keyCode C.int) int { + fmt.Println("show msg in go ",C.int(keyCode)) + //defer C.free(unsafe.Pointer(keyCode)) // will destruct in c + return 1 +} diff --git a/examples/event/main.go b/examples/event/main.go deleted file mode 100644 index a77e3fc..0000000 --- a/examples/event/main.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2016 The go-vgo Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// https://github.com/go-vgo/robotgo/blob/master/LICENSE -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -package main - -import ( - "fmt" - - "github.com/go-vgo/robotgo" - // "go-vgo/robotgo" -) - -func event() { - //////////////////////////////////////////////////////////////////////////////// - // Global event listener - //////////////////////////////////////////////////////////////////////////////// - - fmt.Println("--- Please press v---") - eve := robotgo.AddEvent("v") - - if eve == 0 { - fmt.Println("--- You press v---", "v") - } - - fmt.Println("--- Please press k---") - keve := robotgo.AddEvent("k") - if keve == 0 { - fmt.Println("--- You press k---", "k") - } - - fmt.Println("--- Please press f1---") - feve := robotgo.AddEvent("f1") - if feve == 0 { - fmt.Println("You press...", "f1") - } - - fmt.Println("--- Please press left mouse button---") - mleft := robotgo.AddEvent("mleft") - if mleft == 0 { - fmt.Println("--- You press left mouse button---", "mleft") - } - - mright := robotgo.AddEvent("mright") - if mright == 0 { - fmt.Println("--- You press right mouse button---", "mright") - } - - // stop AddEvent - // robotgo.StopEvent() -} - -func main() { - event() -} diff --git a/writeTest.txt b/writeTest.txt new file mode 100644 index 0000000..985e56c --- /dev/null +++ b/writeTest.txt @@ -0,0 +1 @@ +vvvvvbvvvv \ No newline at end of file