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

Update: Optimize window hand code
This commit is contained in:
Evans 2022-11-28 14:26:43 -08:00 committed by GitHub
commit 3052272818
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 42 additions and 42 deletions

View File

@ -68,10 +68,9 @@ xcode-select --install
Download the Mingw, then set system environment variables `C:\mingw64\bin` to the Path. Download the Mingw, then set system environment variables `C:\mingw64\bin` to the Path.
[Set environment variables to run GCC from command line](https://www.youtube.com/results?search_query=Set+environment+variables+to+run+GCC+from+command+line). [Set environment variables to run GCC from command line](https://www.youtube.com/results?search_query=Set+environment+variables+to+run+GCC+from+command+line).
`
```
Or the other GCC (But you should compile the "libpng" with yourself when use the bitmap.) Or the other GCC (But you should compile the "libpng" with yourself when use the bitmap.)
``` `
#### For everything else: #### For everything else:

2
doc.go
View File

@ -54,7 +54,7 @@ Keys are supported:
"f23" "f23"
"f24" "f24"
"cmd" is the "win" key for windows "cmd" this is the "win" key for windows
"lcmd" left command "lcmd" left command
"rcmd" right command "rcmd" right command
// "command" // "command"

7
key.go
View File

@ -30,6 +30,7 @@ import (
"github.com/vcaesar/tt" "github.com/vcaesar/tt"
) )
// Defining a bunch of constants.
const ( const (
// KeyA define key "a" // KeyA define key "a"
KeyA = "a" KeyA = "a"
@ -321,6 +322,7 @@ var keyNames = map[string]C.MMKeyCode{
// { NULL: C.K_NOT_A_KEY } // { NULL: C.K_NOT_A_KEY }
} }
// It sends a key press and release to the active application
func tapKeyCode(code C.MMKeyCode, flags C.MMKeyFlags, pid C.uintptr) { func tapKeyCode(code C.MMKeyCode, flags C.MMKeyFlags, pid C.uintptr) {
C.toggleKeyCode(code, true, flags, pid) C.toggleKeyCode(code, true, flags, pid)
MilliSleep(3) MilliSleep(3)
@ -459,6 +461,7 @@ func ToStrings(fields []interface{}) []string {
return res return res
} }
// toErr it converts a C string to a Go error
func toErr(str *C.char) error { func toErr(str *C.char) error {
gstr := C.GoString(str) gstr := C.GoString(str)
if gstr == "" { if gstr == "" {
@ -481,6 +484,8 @@ func toErr(str *C.char) error {
// //
// arr := []string{"alt", "command"} // arr := []string{"alt", "command"}
// robotgo.KeyTap("i", arr) // robotgo.KeyTap("i", arr)
//
// robotgo.KeyTap("k", pid int)
func KeyTap(key string, args ...interface{}) error { func KeyTap(key string, args ...interface{}) error {
var keyArr []string var keyArr []string
@ -525,6 +530,7 @@ func KeyTap(key string, args ...interface{}) error {
// robotgo.KeyToggle("a", "up") // robotgo.KeyToggle("a", "up")
// //
// robotgo.KeyToggle("a", "up", "alt", "cmd") // robotgo.KeyToggle("a", "up", "alt", "cmd")
// robotgo.KeyToggle("k", pid int)
func KeyToggle(key string, args ...interface{}) error { func KeyToggle(key string, args ...interface{}) error {
if len(key) > 0 && unicode.IsUpper([]rune(key)[0]) { if len(key) > 0 && unicode.IsUpper([]rune(key)[0]) {
@ -648,6 +654,7 @@ func inputUTF(str string) {
// Examples: // Examples:
// //
// robotgo.TypeStr("abc@123, Hi galaxy, こんにちは") // robotgo.TypeStr("abc@123, Hi galaxy, こんにちは")
// robotgo.TypeStr("To be or not to be, this is questions.", pid int)
func TypeStr(str string, args ...int) { func TypeStr(str string, args ...int) {
var tm, tm1 = 0, 7 var tm, tm1 = 0, 7

View File

@ -1,6 +1,16 @@
#include "keypress.h" // 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 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#include "../base/deadbeef_rand_c.h" #include "../base/deadbeef_rand_c.h"
#include "../base/microsleep.h" #include "../base/microsleep.h"
#include "keypress.h"
#include "keycode_c.h" #include "keycode_c.h"
#include <ctype.h> /* For isupper() */ #include <ctype.h> /* For isupper() */
@ -17,6 +27,14 @@
#if defined(IS_WINDOWS) #if defined(IS_WINDOWS)
HWND GetHwndByPid(DWORD dwProcessId); HWND GetHwndByPid(DWORD dwProcessId);
HWND getHwnd(uintptr pid, int8_t isPid) {
HWND hwnd = (HWND) pid;
if (isPid == 0) {
hwnd = GetHwndByPid(pid);
}
return hwnd;
}
void WIN32_KEY_EVENT_WAIT(MMKeyCode key, DWORD flags, uintptr pid) { void WIN32_KEY_EVENT_WAIT(MMKeyCode key, DWORD flags, uintptr pid) {
win32KeyEvent(key, flags, pid, 0); win32KeyEvent(key, flags, pid, 0);
Sleep(DEADBEEF_RANDRANGE(0, 1)); Sleep(DEADBEEF_RANDRANGE(0, 1));
@ -115,10 +133,8 @@ void win32KeyEvent(int key, MMKeyFlags flags, uintptr pid, int8_t isPid) {
// todo: test this // todo: test this
if (pid != 0) { if (pid != 0) {
HWND hwnd = (HWND) pid; HWND hwnd = getHwnd(pid, isPid);
if (isPid == 0) {
hwnd = GetHwndByPid(pid);
}
int down = (flags == 0 ? WM_KEYDOWN : WM_KEYUP); int down = (flags == 0 ? WM_KEYDOWN : WM_KEYUP);
// SendMessage(hwnd, down, key, 0); // SendMessage(hwnd, down, key, 0);
PostMessageW(hwnd, down, key, 0); PostMessageW(hwnd, down, key, 0);
@ -316,10 +332,7 @@ void unicodeType(const unsigned value, uintptr pid, int8_t isPid){
toggleUnicode(ch, false, pid); toggleUnicode(ch, false, pid);
#elif defined(IS_WINDOWS) #elif defined(IS_WINDOWS)
if (pid != 0) { if (pid != 0) {
HWND hwnd = (HWND) pid; HWND hwnd = getHwnd(pid, isPid);
if (isPid == 0) {
hwnd = GetHwndByPid(pid);
}
// SendMessage(hwnd, down, value, 0); // SendMessage(hwnd, down, value, 0);
PostMessageW(hwnd, WM_CHAR, value, 0); PostMessageW(hwnd, WM_CHAR, value, 0);

View File

@ -18,6 +18,7 @@ int showAlert(const char *title, const char *msg,
CFStringRef defaultButtonTitle = CFStringCreateWithUTF8String(defaultButton); CFStringRef defaultButtonTitle = CFStringCreateWithUTF8String(defaultButton);
CFStringRef cancelButtonTitle = CFStringCreateWithUTF8String(cancelButton); CFStringRef cancelButtonTitle = CFStringCreateWithUTF8String(cancelButton);
CFOptionFlags responseFlags; CFOptionFlags responseFlags;
SInt32 err = CFUserNotificationDisplayAlert( SInt32 err = CFUserNotificationDisplayAlert(
0.0, kCFUserNotificationNoteAlertLevel, NULL, NULL, NULL, alertHeader, alertMessage, 0.0, kCFUserNotificationNoteAlertLevel, NULL, NULL, NULL, alertHeader, alertMessage,
defaultButtonTitle, cancelButtonTitle, NULL, &responseFlags); defaultButtonTitle, cancelButtonTitle, NULL, &responseFlags);

View File

@ -23,12 +23,8 @@ void min_window(uintptr pid, bool state, int8_t isPid){
XDismissErrors(); XDismissErrors();
// SetState((Window)pid, STATE_MINIMIZE, state); // SetState((Window)pid, STATE_MINIMIZE, state);
#elif defined(IS_WINDOWS) #elif defined(IS_WINDOWS)
if (isPid == 0) { HWND hwnd = getHwnd(pid, isPid);
HWND hwnd = GetHwndByPid(pid); win_min(hwnd, state);
win_min(hwnd, state);
} else {
win_min((HWND)pid, state);
}
#endif #endif
} }
@ -40,12 +36,8 @@ void max_window(uintptr pid, bool state, int8_t isPid){
// SetState((Window)pid, STATE_MINIMIZE, false); // SetState((Window)pid, STATE_MINIMIZE, false);
// SetState((Window)pid, STATE_MAXIMIZE, state); // SetState((Window)pid, STATE_MAXIMIZE, state);
#elif defined(IS_WINDOWS) #elif defined(IS_WINDOWS)
if (isPid == 0) { HWND hwnd = getHwnd(pid, isPid);
HWND hwnd = GetHwndByPid(pid); win_max(hwnd, state);
win_max(hwnd, state);
} else {
win_max((HWND)pid, state);
}
#endif #endif
} }

View File

@ -267,6 +267,8 @@ typedef struct _Bounds Bounds;
#elif defined(IS_WINDOWS) #elif defined(IS_WINDOWS)
HWND getHwnd(uintptr pid, int8_t isPid);
void win_min(HWND hwnd, bool state){ void win_min(HWND hwnd, bool state){
if (state) { if (state) {
ShowWindow(hwnd, SW_MINIMIZE); ShowWindow(hwnd, SW_MINIMIZE);

View File

@ -128,12 +128,7 @@ Bounds get_bounds(uintptr pid, int8_t isPid){
return bounds; return bounds;
#elif defined(IS_WINDOWS) #elif defined(IS_WINDOWS)
HWND hwnd; HWND hwnd = getHwnd(pid, isPid);
if (isPid == 0) {
hwnd= GetHwndByPid(pid);
} else {
hwnd = (HWND)pid;
}
RECT rect = { 0 }; RECT rect = { 0 };
GetWindowRect(hwnd, &rect); GetWindowRect(hwnd, &rect);
@ -193,12 +188,7 @@ Bounds get_client(uintptr pid, int8_t isPid) {
return bounds; return bounds;
#elif defined(IS_WINDOWS) #elif defined(IS_WINDOWS)
HWND hwnd; HWND hwnd = getHwnd(pid, isPid);
if (isPid == 0) {
hwnd = GetHwndByPid(pid);
} else {
hwnd = (HWND)pid;
}
RECT rect = { 0 }; RECT rect = { 0 };
GetClientRect(hwnd, &rect); GetClientRect(hwnd, &rect);

View File

@ -59,11 +59,7 @@ MData set_handle_pid(uintptr pid, int8_t isPid){
win.XWin = (Window)pid; // Handle to an X11 window win.XWin = (Window)pid; // Handle to an X11 window
#elif defined(IS_WINDOWS) #elif defined(IS_WINDOWS)
// win.HWnd = (HWND)pid; // Handle to a window HWND // win.HWnd = (HWND)pid; // Handle to a window HWND
if (isPid == 0) { win.HWnd = getHwnd(pid, isPid);
win.HWnd = GetHwndByPid(pid);
} else {
win.HWnd = (HWND)pid;
}
#endif #endif
return win; return win;