mirror of
https://github.com/go-vgo/robotgo.git
synced 2025-05-31 06:13: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 }
|
||||
}
|
||||
|
||||
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)
|
||||
// }
|
||||
|
@ -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 */
|
||||
|
@ -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));
|
||||
|
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user