Merge pull request #475 from go-vgo/bitmap-pr

Add send key event by pid support [mac]
This commit is contained in:
Evans 2022-02-17 12:36:44 -08:00 committed by GitHub
commit 3d7cce3a31
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 75 additions and 42 deletions

67
key.go
View File

@ -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)
// }

View File

@ -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 */

View File

@ -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));

View File

@ -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 <stdio.h>