mirror of
https://github.com/go-vgo/robotgo.git
synced 2025-06-01 14:43:55 +00:00
Merge pull request #475 from go-vgo/bitmap-pr
Add send key event by pid support [mac]
This commit is contained in:
commit
3d7cce3a31
67
key.go
67
key.go
@ -321,10 +321,10 @@ var keyNames = map[string]C.MMKeyCode{
|
|||||||
// { NULL: C.K_NOT_A_KEY }
|
// { NULL: C.K_NOT_A_KEY }
|
||||||
}
|
}
|
||||||
|
|
||||||
func tapKeyCode(code C.MMKeyCode, flags C.MMKeyFlags) {
|
func tapKeyCode(code C.MMKeyCode, flags C.MMKeyFlags, pid C.int32_t) {
|
||||||
C.toggleKeyCode(code, true, flags)
|
C.toggleKeyCode(code, true, flags, pid)
|
||||||
MilliSleep(5)
|
MilliSleep(5)
|
||||||
C.toggleKeyCode(code, false, flags)
|
C.toggleKeyCode(code, false, flags, pid)
|
||||||
}
|
}
|
||||||
|
|
||||||
var keyErr = errors.New("Invalid key flag specified.")
|
var keyErr = errors.New("Invalid key flag specified.")
|
||||||
@ -394,19 +394,19 @@ func getFlagsFromValue(value []string) (flags C.MMKeyFlags) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func keyTaps(k string, keyArr []string) error {
|
func keyTaps(k string, keyArr []string, pid int) error {
|
||||||
flags := getFlagsFromValue(keyArr)
|
flags := getFlagsFromValue(keyArr)
|
||||||
key, err := checkKeyCodes(k)
|
key, err := checkKeyCodes(k)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tapKeyCode(key, flags)
|
tapKeyCode(key, flags, C.int32_t(pid))
|
||||||
MilliSleep(KeySleep)
|
MilliSleep(KeySleep)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func keyToggles(k string, keyArr []string) error {
|
func keyToggles(k string, keyArr []string, pid int) error {
|
||||||
down := true
|
down := true
|
||||||
if keyArr[0] == "up" {
|
if keyArr[0] == "up" {
|
||||||
down = false
|
down = false
|
||||||
@ -418,7 +418,7 @@ func keyToggles(k string, keyArr []string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
C.toggleKeyCode(key, C.bool(down), flags)
|
C.toggleKeyCode(key, C.bool(down), flags, C.int32_t(pid))
|
||||||
MilliSleep(KeySleep)
|
MilliSleep(KeySleep)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -487,15 +487,21 @@ func KeyTap(key string, args ...interface{}) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pid := 0
|
||||||
if len(args) > 0 {
|
if len(args) > 0 {
|
||||||
if reflect.TypeOf(args[0]) == reflect.TypeOf(keyArr) {
|
if reflect.TypeOf(args[0]) == reflect.TypeOf(keyArr) {
|
||||||
keyArr = args[0].([]string)
|
keyArr = args[0].([]string)
|
||||||
} else {
|
} 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"
|
// 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")
|
// robotgo.KeyToggle("a", "up", "alt", "cmd")
|
||||||
//
|
//
|
||||||
func KeyToggle(key string, args ...string) error {
|
func KeyToggle(key string, args ...interface{}) error {
|
||||||
if len(args) <= 0 {
|
if len(args) <= 0 {
|
||||||
args = append(args, "down")
|
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
|
// KeyPress press key string
|
||||||
func KeyPress(key string, args ...string) error {
|
func KeyPress(key string, args ...interface{}) error {
|
||||||
err := KeyDown(key, args...)
|
err := KeyDown(key, args...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -541,13 +556,13 @@ func KeyPress(key string, args ...string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// KeyDown press down a key
|
// KeyDown press down a key
|
||||||
func KeyDown(key string, args ...string) error {
|
func KeyDown(key string, args ...interface{}) error {
|
||||||
return KeyToggle(key, args...)
|
return KeyToggle(key, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// KeyUp press up a key
|
// KeyUp press up a key
|
||||||
func KeyUp(key string, args ...string) error {
|
func KeyUp(key string, args ...interface{}) error {
|
||||||
arr := []string{"up"}
|
arr := []interface{}{"up"}
|
||||||
arr = append(arr, args...)
|
arr = append(arr, args...)
|
||||||
return KeyToggle(key, arr...)
|
return KeyToggle(key, arr...)
|
||||||
}
|
}
|
||||||
@ -576,9 +591,13 @@ func CharCodeAt(s string, n int) rune {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// UnicodeType tap uint32 unicode
|
// UnicodeType tap uint32 unicode
|
||||||
func UnicodeType(str uint32) {
|
func UnicodeType(str uint32, args ...int) {
|
||||||
cstr := C.uint(str)
|
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
|
// ToUC trans string to unicode []string
|
||||||
@ -611,7 +630,7 @@ func inputUTF(str string) {
|
|||||||
|
|
||||||
// TypeStr send a string, supported UTF-8
|
// 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:
|
// Examples:
|
||||||
// robotgo.TypeStr("abc@123, hi galaxy, こんにちは")
|
// robotgo.TypeStr("abc@123, hi galaxy, こんにちは")
|
||||||
@ -619,12 +638,16 @@ func inputUTF(str string) {
|
|||||||
func TypeStr(str string, args ...int) {
|
func TypeStr(str string, args ...int) {
|
||||||
var tm, tm1 = 0, 7
|
var tm, tm1 = 0, 7
|
||||||
|
|
||||||
if len(args) > 0 {
|
if len(args) > 1 {
|
||||||
tm = args[0]
|
tm = args[0]
|
||||||
}
|
}
|
||||||
if len(args) > 1 {
|
if len(args) > 2 {
|
||||||
tm1 = args[1]
|
tm1 = args[1]
|
||||||
}
|
}
|
||||||
|
pid := 0
|
||||||
|
if len(args) > 0 {
|
||||||
|
pid = args[0]
|
||||||
|
}
|
||||||
|
|
||||||
if runtime.GOOS == "linux" {
|
if runtime.GOOS == "linux" {
|
||||||
strUc := ToUC(str)
|
strUc := ToUC(str)
|
||||||
@ -632,7 +655,7 @@ func TypeStr(str string, args ...int) {
|
|||||||
ru := []rune(strUc[i])
|
ru := []rune(strUc[i])
|
||||||
if len(ru) <= 1 {
|
if len(ru) <= 1 {
|
||||||
ustr := uint32(CharCodeAt(strUc[i], 0))
|
ustr := uint32(CharCodeAt(strUc[i], 0))
|
||||||
UnicodeType(ustr)
|
UnicodeType(ustr, pid)
|
||||||
} else {
|
} else {
|
||||||
inputUTF(strUc[i])
|
inputUTF(strUc[i])
|
||||||
MilliSleep(tm1)
|
MilliSleep(tm1)
|
||||||
@ -645,7 +668,7 @@ func TypeStr(str string, args ...int) {
|
|||||||
|
|
||||||
for i := 0; i < len([]rune(str)); i++ {
|
for i := 0; i < len([]rune(str)); i++ {
|
||||||
ustr := uint32(CharCodeAt(str, i))
|
ustr := uint32(CharCodeAt(str, i))
|
||||||
UnicodeType(ustr)
|
UnicodeType(ustr, pid)
|
||||||
// if len(args) > 0 {
|
// if len(args) > 0 {
|
||||||
MilliSleep(tm)
|
MilliSleep(tm)
|
||||||
// }
|
// }
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
|
|
||||||
#if defined(IS_WINDOWS)
|
#if defined(IS_WINDOWS)
|
||||||
/* Send win32 key event for given key. */
|
/* Send win32 key event for given key. */
|
||||||
void win32KeyEvent(int key, MMKeyFlags flags);
|
void win32KeyEvent(int key, MMKeyFlags flags, int32_t pid);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* KEYPRESS_H */
|
#endif /* KEYPRESS_H */
|
||||||
|
@ -14,8 +14,8 @@
|
|||||||
|
|
||||||
/* Convenience wrappers around ugly APIs. */
|
/* Convenience wrappers around ugly APIs. */
|
||||||
#if defined(IS_WINDOWS)
|
#if defined(IS_WINDOWS)
|
||||||
void WIN32_KEY_EVENT_WAIT(MMKeyCode key, DWORD flags) {
|
void WIN32_KEY_EVENT_WAIT(MMKeyCode key, DWORD flags, int32_t pid) {
|
||||||
win32KeyEvent(key, flags);
|
win32KeyEvent(key, flags, pid);
|
||||||
Sleep(DEADBEEF_RANDRANGE(0, 1));
|
Sleep(DEADBEEF_RANDRANGE(0, 1));
|
||||||
}
|
}
|
||||||
#elif defined(USE_X11)
|
#elif defined(USE_X11)
|
||||||
@ -31,6 +31,15 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(IS_MACOSX)
|
#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 io_connect_t _getAuxiliaryKeyDriver(void) {
|
||||||
static mach_port_t sEventDrvrRef = 0;
|
static mach_port_t sEventDrvrRef = 0;
|
||||||
mach_port_t masterPort, service, iter;
|
mach_port_t masterPort, service, iter;
|
||||||
@ -56,7 +65,7 @@ static io_connect_t _getAuxiliaryKeyDriver(void) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(IS_WINDOWS)
|
#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);
|
int scan = MapVirtualKey(key & 0xff, MAPVK_VK_TO_VSC);
|
||||||
|
|
||||||
/* Set the scan code for extended keys */
|
/* Set the scan code for extended keys */
|
||||||
@ -117,7 +126,7 @@ void win32KeyEvent(int key, MMKeyFlags flags) {
|
|||||||
}
|
}
|
||||||
#endif
|
#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)
|
#if defined(IS_MACOSX)
|
||||||
/* The media keys all have 1000 added to them to help us detect them. */
|
/* The media keys all have 1000 added to them to help us detect them. */
|
||||||
if (code >= 1000) {
|
if (code >= 1000) {
|
||||||
@ -143,19 +152,20 @@ void toggleKeyCode(MMKeyCode code, const bool down, MMKeyFlags flags) {
|
|||||||
if (flags != 0) {
|
if (flags != 0) {
|
||||||
CGEventSetFlags(keyEvent, (CGEventFlags) flags);
|
CGEventSetFlags(keyEvent, (CGEventFlags) flags);
|
||||||
}
|
}
|
||||||
CGEventPost(kCGSessionEventTap, keyEvent);
|
|
||||||
|
SendTo(pid, keyEvent);
|
||||||
CFRelease(keyEvent);
|
CFRelease(keyEvent);
|
||||||
}
|
}
|
||||||
#elif defined(IS_WINDOWS)
|
#elif defined(IS_WINDOWS)
|
||||||
const DWORD dwFlags = down ? 0 : KEYEVENTF_KEYUP;
|
const DWORD dwFlags = down ? 0 : KEYEVENTF_KEYUP;
|
||||||
|
|
||||||
/* Parse modifier keys. */
|
/* Parse modifier keys. */
|
||||||
if (flags & MOD_META) { WIN32_KEY_EVENT_WAIT(K_META, dwFlags); }
|
if (flags & MOD_META) { WIN32_KEY_EVENT_WAIT(K_META, dwFlags, pid); }
|
||||||
if (flags & MOD_ALT) { WIN32_KEY_EVENT_WAIT(K_ALT, dwFlags); }
|
if (flags & MOD_ALT) { WIN32_KEY_EVENT_WAIT(K_ALT, dwFlags, pid); }
|
||||||
if (flags & MOD_CONTROL) { WIN32_KEY_EVENT_WAIT(K_CONTROL, dwFlags); }
|
if (flags & MOD_CONTROL) { WIN32_KEY_EVENT_WAIT(K_CONTROL, dwFlags, pid); }
|
||||||
if (flags & MOD_SHIFT) { WIN32_KEY_EVENT_WAIT(K_SHIFT, dwFlags); }
|
if (flags & MOD_SHIFT) { WIN32_KEY_EVENT_WAIT(K_SHIFT, dwFlags, pid); }
|
||||||
|
|
||||||
win32KeyEvent(code, dwFlags);
|
win32KeyEvent(code, dwFlags, pid);
|
||||||
#elif defined(USE_X11)
|
#elif defined(USE_X11)
|
||||||
Display *display = XGetMainDisplay();
|
Display *display = XGetMainDisplay();
|
||||||
const Bool is_press = down ? True : False; /* Just to be safe. */
|
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
|
#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);
|
MMKeyCode keyCode = keyCodeForChar(c);
|
||||||
|
|
||||||
//Prevent unused variable warning for Mac and Linux.
|
//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.
|
keyCode = keyCode & 0xff; // Mask out modifiers.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
toggleKeyCode(keyCode, down, flags);
|
toggleKeyCode(keyCode, down, flags, pid);
|
||||||
}
|
}
|
||||||
|
|
||||||
// void tapKey(char c, MMKeyFlags flags){
|
// void tapKey(char c, MMKeyFlags flags){
|
||||||
@ -229,7 +239,7 @@ void toggleKey(char c, const bool down, MMKeyFlags flags){
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
#if defined(IS_MACOSX)
|
#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(),
|
/* This function relies on the convenient CGEventKeyboardSetUnicodeString(),
|
||||||
convert characters to a keycode, but does not support adding modifier flags.
|
convert characters to a keycode, but does not support adding modifier flags.
|
||||||
It is only used in typeString().
|
It is only used in typeString().
|
||||||
@ -242,13 +252,13 @@ void toggleUnicode(UniChar ch, const bool down) {
|
|||||||
|
|
||||||
CGEventKeyboardSetUnicodeString(keyEvent, 1, &ch);
|
CGEventKeyboardSetUnicodeString(keyEvent, 1, &ch);
|
||||||
|
|
||||||
CGEventPost(kCGSessionEventTap, keyEvent);
|
SendTo(pid, keyEvent);
|
||||||
CFRelease(keyEvent);
|
CFRelease(keyEvent);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(USE_X11)
|
#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) {
|
int input_utf(const char *utf) {
|
||||||
Display *dpy = XOpenDisplay(NULL);
|
Display *dpy = XOpenDisplay(NULL);
|
||||||
@ -280,13 +290,13 @@ void toggleUnicode(UniChar ch, const bool down) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// unicode type
|
// unicode type
|
||||||
void unicodeType(const unsigned value){
|
void unicodeType(const unsigned value, int32_t pid){
|
||||||
#if defined(IS_MACOSX)
|
#if defined(IS_MACOSX)
|
||||||
UniChar ch = (UniChar)value; // Convert to unsigned char
|
UniChar ch = (UniChar)value; // Convert to unsigned char
|
||||||
|
|
||||||
toggleUnicode(ch, true);
|
toggleUnicode(ch, true, pid);
|
||||||
microsleep(5.0);
|
microsleep(5.0);
|
||||||
toggleUnicode(ch, false);
|
toggleUnicode(ch, false, pid);
|
||||||
#elif defined(IS_WINDOWS)
|
#elif defined(IS_WINDOWS)
|
||||||
INPUT input[2];
|
INPUT input[2];
|
||||||
memset(input, 0, sizeof(input));
|
memset(input, 0, sizeof(input));
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
#include "../base/types.h"
|
#include "../base/types.h"
|
||||||
#include "../base/rgb.h"
|
#include "../base/rgb.h"
|
||||||
#include "../base/win32.h"
|
#include "../base/pubs.h"
|
||||||
#include "screengrab_c.h"
|
#include "screengrab_c.h"
|
||||||
#include "screen_c.h"
|
#include "screen_c.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
Loading…
Reference in New Issue
Block a user