diff --git a/base/win32.h b/base/pubs.h similarity index 100% rename from base/win32.h rename to base/pubs.h diff --git a/key.go b/key.go index f99c3e8..b9a6168 100644 --- a/key.go +++ b/key.go @@ -321,10 +321,10 @@ var keyNames = map[string]C.MMKeyCode{ // { NULL: C.K_NOT_A_KEY } } -func tapKeyCode(code C.MMKeyCode, flags C.MMKeyFlags) { - C.toggleKeyCode(code, true, flags) +func tapKeyCode(code C.MMKeyCode, flags C.MMKeyFlags, pid C.int32_t) { + C.toggleKeyCode(code, true, flags, pid) MilliSleep(5) - C.toggleKeyCode(code, false, flags) + C.toggleKeyCode(code, false, flags, pid) } var keyErr = errors.New("Invalid key flag specified.") @@ -394,19 +394,19 @@ func getFlagsFromValue(value []string) (flags C.MMKeyFlags) { return } -func keyTaps(k string, keyArr []string) error { +func keyTaps(k string, keyArr []string, pid int) error { flags := getFlagsFromValue(keyArr) key, err := checkKeyCodes(k) if err != nil { return err } - tapKeyCode(key, flags) + tapKeyCode(key, flags, C.int32_t(pid)) MilliSleep(KeySleep) return nil } -func keyToggles(k string, keyArr []string) error { +func keyToggles(k string, keyArr []string, pid int) error { down := true if keyArr[0] == "up" { down = false @@ -418,7 +418,7 @@ func keyToggles(k string, keyArr []string) error { return err } - C.toggleKeyCode(key, C.bool(down), flags) + C.toggleKeyCode(key, C.bool(down), flags, C.int32_t(pid)) MilliSleep(KeySleep) return nil } @@ -487,15 +487,21 @@ func KeyTap(key string, args ...interface{}) error { } } + pid := 0 if len(args) > 0 { if reflect.TypeOf(args[0]) == reflect.TypeOf(keyArr) { keyArr = args[0].([]string) } else { - keyArr = ToStrings(args) + if reflect.TypeOf(args[0]) == reflect.TypeOf(pid) { + pid = args[0].(int) + keyArr = ToStrings(args[1:]) + } else { + keyArr = ToStrings(args) + } } } - return keyTaps(key, keyArr) + return keyTaps(key, keyArr, pid) } // KeyToggle toggle the keyboard, if there not have args default is "down" @@ -509,7 +515,7 @@ func KeyTap(key string, args ...interface{}) error { // // robotgo.KeyToggle("a", "up", "alt", "cmd") // -func KeyToggle(key string, args ...string) error { +func KeyToggle(key string, args ...interface{}) error { if len(args) <= 0 { args = append(args, "down") } @@ -526,11 +532,20 @@ func KeyToggle(key string, args ...string) error { } } - return keyToggles(key, args) + pid := 0 + var keyArr []string + if len(args) > 0 && reflect.TypeOf(args[0]) == reflect.TypeOf(pid) { + pid = args[0].(int) + keyArr = ToStrings(args[1:]) + } else { + keyArr = ToStrings(args) + } + + return keyToggles(key, keyArr, pid) } // KeyPress press key string -func KeyPress(key string, args ...string) error { +func KeyPress(key string, args ...interface{}) error { err := KeyDown(key, args...) if err != nil { return err @@ -541,13 +556,13 @@ func KeyPress(key string, args ...string) error { } // KeyDown press down a key -func KeyDown(key string, args ...string) error { +func KeyDown(key string, args ...interface{}) error { return KeyToggle(key, args...) } // KeyUp press up a key -func KeyUp(key string, args ...string) error { - arr := []string{"up"} +func KeyUp(key string, args ...interface{}) error { + arr := []interface{}{"up"} arr = append(arr, args...) return KeyToggle(key, arr...) } @@ -576,9 +591,13 @@ func CharCodeAt(s string, n int) rune { } // UnicodeType tap uint32 unicode -func UnicodeType(str uint32) { +func UnicodeType(str uint32, args ...int) { cstr := C.uint(str) - C.unicodeType(cstr) + pid := 0 + if len(args) > 0 { + pid = args[0] + } + C.unicodeType(cstr, C.int32_t(pid)) } // ToUC trans string to unicode []string @@ -611,7 +630,7 @@ func inputUTF(str string) { // TypeStr send a string, supported UTF-8 // -// robotgo.TypeStr(string: "The string to send", int: "milli_sleep time", "x11 option") +// robotgo.TypeStr(string: "The string to send", int: pid, "milli_sleep time", "x11 option") // // Examples: // robotgo.TypeStr("abc@123, hi galaxy, こんにちは") @@ -619,12 +638,16 @@ func inputUTF(str string) { func TypeStr(str string, args ...int) { var tm, tm1 = 0, 7 - if len(args) > 0 { + if len(args) > 1 { tm = args[0] } - if len(args) > 1 { + if len(args) > 2 { tm1 = args[1] } + pid := 0 + if len(args) > 0 { + pid = args[0] + } if runtime.GOOS == "linux" { strUc := ToUC(str) @@ -632,7 +655,7 @@ func TypeStr(str string, args ...int) { ru := []rune(strUc[i]) if len(ru) <= 1 { ustr := uint32(CharCodeAt(strUc[i], 0)) - UnicodeType(ustr) + UnicodeType(ustr, pid) } else { inputUTF(strUc[i]) MilliSleep(tm1) @@ -645,7 +668,7 @@ func TypeStr(str string, args ...int) { for i := 0; i < len([]rune(str)); i++ { ustr := uint32(CharCodeAt(str, i)) - UnicodeType(ustr) + UnicodeType(ustr, pid) // if len(args) > 0 { MilliSleep(tm) // } diff --git a/key/keypress.h b/key/keypress.h index 6b74da7..d461322 100644 --- a/key/keypress.h +++ b/key/keypress.h @@ -37,7 +37,7 @@ #if defined(IS_WINDOWS) /* Send win32 key event for given key. */ - void win32KeyEvent(int key, MMKeyFlags flags); + void win32KeyEvent(int key, MMKeyFlags flags, int32_t pid); #endif #endif /* KEYPRESS_H */ diff --git a/key/keypress_c.h b/key/keypress_c.h index dca304e..2f225ed 100644 --- a/key/keypress_c.h +++ b/key/keypress_c.h @@ -14,8 +14,8 @@ /* Convenience wrappers around ugly APIs. */ #if defined(IS_WINDOWS) - void WIN32_KEY_EVENT_WAIT(MMKeyCode key, DWORD flags) { - win32KeyEvent(key, flags); + void WIN32_KEY_EVENT_WAIT(MMKeyCode key, DWORD flags, int32_t pid) { + win32KeyEvent(key, flags, pid); Sleep(DEADBEEF_RANDRANGE(0, 1)); } #elif defined(USE_X11) @@ -31,6 +31,15 @@ #endif #if defined(IS_MACOSX) + int SendTo(int32_t pid, CGEventRef event) { + if (pid != 0) { + CGEventPostToPid(pid, event); + } else { + CGEventPost(kCGSessionEventTap, event); + } + return 0; + } + static io_connect_t _getAuxiliaryKeyDriver(void) { static mach_port_t sEventDrvrRef = 0; mach_port_t masterPort, service, iter; @@ -56,7 +65,7 @@ static io_connect_t _getAuxiliaryKeyDriver(void) { #endif #if defined(IS_WINDOWS) -void win32KeyEvent(int key, MMKeyFlags flags) { +void win32KeyEvent(int key, MMKeyFlags flags, int32_t pid) { int scan = MapVirtualKey(key & 0xff, MAPVK_VK_TO_VSC); /* Set the scan code for extended keys */ @@ -117,7 +126,7 @@ void win32KeyEvent(int key, MMKeyFlags flags) { } #endif -void toggleKeyCode(MMKeyCode code, const bool down, MMKeyFlags flags) { +void toggleKeyCode(MMKeyCode code, const bool down, MMKeyFlags flags, int32_t pid) { #if defined(IS_MACOSX) /* The media keys all have 1000 added to them to help us detect them. */ if (code >= 1000) { @@ -143,19 +152,20 @@ void toggleKeyCode(MMKeyCode code, const bool down, MMKeyFlags flags) { if (flags != 0) { CGEventSetFlags(keyEvent, (CGEventFlags) flags); } - CGEventPost(kCGSessionEventTap, keyEvent); + + SendTo(pid, keyEvent); CFRelease(keyEvent); } #elif defined(IS_WINDOWS) const DWORD dwFlags = down ? 0 : KEYEVENTF_KEYUP; /* Parse modifier keys. */ - if (flags & MOD_META) { WIN32_KEY_EVENT_WAIT(K_META, dwFlags); } - if (flags & MOD_ALT) { WIN32_KEY_EVENT_WAIT(K_ALT, dwFlags); } - if (flags & MOD_CONTROL) { WIN32_KEY_EVENT_WAIT(K_CONTROL, dwFlags); } - if (flags & MOD_SHIFT) { WIN32_KEY_EVENT_WAIT(K_SHIFT, dwFlags); } + if (flags & MOD_META) { WIN32_KEY_EVENT_WAIT(K_META, dwFlags, pid); } + if (flags & MOD_ALT) { WIN32_KEY_EVENT_WAIT(K_ALT, dwFlags, pid); } + if (flags & MOD_CONTROL) { WIN32_KEY_EVENT_WAIT(K_CONTROL, dwFlags, pid); } + if (flags & MOD_SHIFT) { WIN32_KEY_EVENT_WAIT(K_SHIFT, dwFlags, pid); } - win32KeyEvent(code, dwFlags); + win32KeyEvent(code, dwFlags, pid); #elif defined(USE_X11) Display *display = XGetMainDisplay(); const Bool is_press = down ? True : False; /* Just to be safe. */ @@ -193,7 +203,7 @@ void toggleKeyCode(MMKeyCode code, const bool down, MMKeyFlags flags) { } #endif -void toggleKey(char c, const bool down, MMKeyFlags flags){ +void toggleKey(char c, const bool down, MMKeyFlags flags, int32_t pid) { MMKeyCode keyCode = keyCodeForChar(c); //Prevent unused variable warning for Mac and Linux. @@ -219,7 +229,7 @@ void toggleKey(char c, const bool down, MMKeyFlags flags){ keyCode = keyCode & 0xff; // Mask out modifiers. #endif - toggleKeyCode(keyCode, down, flags); + toggleKeyCode(keyCode, down, flags, pid); } // void tapKey(char c, MMKeyFlags flags){ @@ -229,7 +239,7 @@ void toggleKey(char c, const bool down, MMKeyFlags flags){ // } #if defined(IS_MACOSX) -void toggleUnicode(UniChar ch, const bool down) { +void toggleUnicode(UniChar ch, const bool down, int32_t pid) { /* This function relies on the convenient CGEventKeyboardSetUnicodeString(), convert characters to a keycode, but does not support adding modifier flags. It is only used in typeString(). @@ -242,13 +252,13 @@ void toggleUnicode(UniChar ch, const bool down) { CGEventKeyboardSetUnicodeString(keyEvent, 1, &ch); - CGEventPost(kCGSessionEventTap, keyEvent); + SendTo(pid, keyEvent); CFRelease(keyEvent); } #endif #if defined(USE_X11) - #define toggleUniKey(c, down) toggleKey(c, down, MOD_NONE) + #define toggleUniKey(c, down) toggleKey(c, down, MOD_NONE, 0) int input_utf(const char *utf) { Display *dpy = XOpenDisplay(NULL); @@ -280,13 +290,13 @@ void toggleUnicode(UniChar ch, const bool down) { #endif // unicode type -void unicodeType(const unsigned value){ +void unicodeType(const unsigned value, int32_t pid){ #if defined(IS_MACOSX) UniChar ch = (UniChar)value; // Convert to unsigned char - toggleUnicode(ch, true); + toggleUnicode(ch, true, pid); microsleep(5.0); - toggleUnicode(ch, false); + toggleUnicode(ch, false, pid); #elif defined(IS_WINDOWS) INPUT input[2]; memset(input, 0, sizeof(input)); diff --git a/screen/goScreen.h b/screen/goScreen.h index 77934e6..2a2bc88 100644 --- a/screen/goScreen.h +++ b/screen/goScreen.h @@ -10,7 +10,7 @@ #include "../base/types.h" #include "../base/rgb.h" -#include "../base/win32.h" +#include "../base/pubs.h" #include "screengrab_c.h" #include "screen_c.h" #include