From 5c13636739e456e90a3e93f6c458247dc5c74478 Mon Sep 17 00:00:00 2001 From: vcaesar Date: Sun, 29 Jul 2018 23:48:32 +0800 Subject: [PATCH 1/7] add min and max window support --- window/goWindow.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/window/goWindow.h b/window/goWindow.h index ec77960..72f47be 100644 --- a/window/goWindow.h +++ b/window/goWindow.h @@ -57,6 +57,24 @@ bool is_valid(){ // return z; // } +#if defined(IS_WINDOWS) +void win_min(HWND hwnd, bool state){ + if (state) { + ShowWindow(hwnd, SW_MINIMIZE); + } else { + ShowWindow(hwnd, SW_RESTORE); + } +} + +void win_max(HWND hwnd, bool state){ + if (state) { + ShowWindow(hwnd, SW_MAXIMIZE); + } else { + ShowWindow(hwnd, SW_RESTORE); + } +} +#endif + void close_window(void){ CloseWin(); } From cc6ebbbf33f80d93c794777895056f17270177cf Mon Sep 17 00:00:00 2001 From: vcaesar Date: Sun, 29 Jul 2018 23:53:54 +0800 Subject: [PATCH 2/7] add max and min c func --- window/goWindow.h | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/window/goWindow.h b/window/goWindow.h index 72f47be..fefb8dd 100644 --- a/window/goWindow.h +++ b/window/goWindow.h @@ -75,6 +75,43 @@ void win_max(HWND hwnd, bool state){ } #endif +void min_window(uintptr pid, bool state, uintptr isHwnd){ + #if defined(IS_MACOSX) + // return 0; + AXUIElementRef axID = AXUIElementCreateApplication(pid); + AXUIElementSetAttributeValue(axID, kAXMinimizedAttribute, + state ? kCFBooleanTrue : kCFBooleanFalse); + #elif defined(USE_X11) + // Ignore X errors + XDismissErrors(); + // SetState((Window)pid, STATE_MINIMIZE, state); + #elif defined(IS_WINDOWS) + if (isHwnd == 0) { + HWND hwnd = GetHwndByPId(pid); + win_min(hwnd, state) + } else { + win_min((HWND)pid, state); + } + #endif +} + +void max_window(uintptr pid, bool state, uintptr isHwnd){ + #if defined(IS_MACOSX) + // return 0; + #elif defined(USE_X11) + XDismissErrors(); + // SetState((Window)pid, STATE_MINIMIZE, false); + // SetState((Window)pid, STATE_MAXIMIZE, state); + #elif defined(IS_WINDOWS) + if (isHwnd == 0) { + HWND hwnd = GetHwndByPId(pid); + win_max(hwnd, state); + } else { + win_max((HWND)pid, state); + } + #endif +} + void close_window(void){ CloseWin(); } From 409c2361f3f07b02d21ec7dde2eaa6a1db129cd4 Mon Sep 17 00:00:00 2001 From: vcaesar Date: Sun, 29 Jul 2018 23:56:28 +0800 Subject: [PATCH 3/7] add max and min go func --- robotgo.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/robotgo.go b/robotgo.go index 83acb42..c4fb2b0 100644 --- a/robotgo.go +++ b/robotgo.go @@ -1286,6 +1286,26 @@ func GetActive() C.MData { return mdata } +// MinWindow set the window min +func MinWindow(pid int32, state bool, args ...int) { + var hwnd int + if len(args) > 0 { + hwnd = args[0] + } + + C.min_window(C.uintptr(pid), C.bool(state), C.uintptr(hwnd)) +} + +// MaxWindow set the window max +func MaxWindow(pid int32, state bool, args ...int) { + var hwnd int + if len(args) > 0 { + hwnd = args[0] + } + + C.max_window(C.uintptr(pid), C.bool(state), C.uintptr(hwnd)) +} + // CloseWindow close the window func CloseWindow() { C.close_window() From b6c5583f19edd433e485542fc4e26d997bf47559 Mon Sep 17 00:00:00 2001 From: vcaesar Date: Mon, 30 Jul 2018 00:01:10 +0800 Subject: [PATCH 4/7] update code style and fix end --- window/goWindow.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/window/goWindow.h b/window/goWindow.h index fefb8dd..3e43233 100644 --- a/window/goWindow.h +++ b/window/goWindow.h @@ -79,6 +79,7 @@ void min_window(uintptr pid, bool state, uintptr isHwnd){ #if defined(IS_MACOSX) // return 0; AXUIElementRef axID = AXUIElementCreateApplication(pid); + AXUIElementSetAttributeValue(axID, kAXMinimizedAttribute, state ? kCFBooleanTrue : kCFBooleanFalse); #elif defined(USE_X11) @@ -88,7 +89,7 @@ void min_window(uintptr pid, bool state, uintptr isHwnd){ #elif defined(IS_WINDOWS) if (isHwnd == 0) { HWND hwnd = GetHwndByPId(pid); - win_min(hwnd, state) + win_min(hwnd, state); } else { win_min((HWND)pid, state); } From b13ad7986e48b8faeffe66b42747832ad65a40bd Mon Sep 17 00:00:00 2001 From: vcaesar Date: Mon, 30 Jul 2018 00:09:46 +0800 Subject: [PATCH 5/7] add win32.h file --- window/goWindow.h | 47 +---------------------------------------------- window/win32.h | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 46 deletions(-) create mode 100644 window/win32.h diff --git a/window/goWindow.h b/window/goWindow.h index 3e43233..cd49821 100644 --- a/window/goWindow.h +++ b/window/goWindow.h @@ -10,6 +10,7 @@ #include "alert_c.h" #include "window.h" +#include "win32.h" int show_alert(const char *title, const char *msg, const char *defaultButton, const char *cancelButton){ @@ -57,24 +58,6 @@ bool is_valid(){ // return z; // } -#if defined(IS_WINDOWS) -void win_min(HWND hwnd, bool state){ - if (state) { - ShowWindow(hwnd, SW_MINIMIZE); - } else { - ShowWindow(hwnd, SW_RESTORE); - } -} - -void win_max(HWND hwnd, bool state){ - if (state) { - ShowWindow(hwnd, SW_MAXIMIZE); - } else { - ShowWindow(hwnd, SW_RESTORE); - } -} -#endif - void min_window(uintptr pid, bool state, uintptr isHwnd){ #if defined(IS_MACOSX) // return 0; @@ -142,34 +125,6 @@ void set_active(const MData win){ SetActive(win); } -#if defined(IS_WINDOWS) - typedef struct{ - HWND hWnd; - DWORD dwPid; - }WNDINFO; - - BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam){ - WNDINFO* pInfo = (WNDINFO*)lParam; - DWORD dwProcessId = 0; - GetWindowThreadProcessId(hWnd, &dwProcessId); - - if (dwProcessId == pInfo->dwPid) { - pInfo->hWnd = hWnd; - return FALSE; - } - return TRUE; - } - - HWND GetHwndByPId(DWORD dwProcessId){ - WNDINFO info = {0}; - info.hWnd = NULL; - info.dwPid = dwProcessId; - EnumWindows(EnumWindowsProc, (LPARAM)&info); - // printf("%d\n", info.hWnd); - return info.hWnd; - } -#endif - void active_PID(uintptr pid, uintptr isHwnd){ MData win; #if defined(IS_MACOSX) diff --git a/window/win32.h b/window/win32.h new file mode 100644 index 0000000..b13dded --- /dev/null +++ b/window/win32.h @@ -0,0 +1,46 @@ +// #include "../base/os.h" + +#if defined(IS_WINDOWS) + typedef struct{ + HWND hWnd; + DWORD dwPid; + }WNDINFO; + + BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam){ + WNDINFO* pInfo = (WNDINFO*)lParam; + DWORD dwProcessId = 0; + GetWindowThreadProcessId(hWnd, &dwProcessId); + + if (dwProcessId == pInfo->dwPid) { + pInfo->hWnd = hWnd; + return FALSE; + } + return TRUE; + } + + HWND GetHwndByPId(DWORD dwProcessId){ + WNDINFO info = {0}; + info.hWnd = NULL; + info.dwPid = dwProcessId; + EnumWindows(EnumWindowsProc, (LPARAM)&info); + // printf("%d\n", info.hWnd); + return info.hWnd; + } + + // window + void win_min(HWND hwnd, bool state){ + if (state) { + ShowWindow(hwnd, SW_MINIMIZE); + } else { + ShowWindow(hwnd, SW_RESTORE); + } + } + + void win_max(HWND hwnd, bool state){ + if (state) { + ShowWindow(hwnd, SW_MAXIMIZE); + } else { + ShowWindow(hwnd, SW_RESTORE); + } + } +#endif \ No newline at end of file From 2a461274b6a8f37327f8325011bf2ec286b906db Mon Sep 17 00:00:00 2001 From: vcaesar Date: Mon, 30 Jul 2018 00:23:35 +0800 Subject: [PATCH 6/7] add GetForegroundWindow func support --- robotgo_win.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/robotgo_win.go b/robotgo_win.go index 0a188fc..f8a0242 100644 --- a/robotgo_win.go +++ b/robotgo_win.go @@ -14,3 +14,10 @@ func FindWindow(str string) win.HWND { return hwnd } + +// GetHWND get foreground window hwnd +func GetHWND() win.HWND { + hwnd := win.GetForegroundWindow() + + return hwnd +} From e4a8b1f8544c07bbe81644f76692ba0b1ff579ca Mon Sep 17 00:00:00 2001 From: vcaesar Date: Mon, 30 Jul 2018 00:57:31 +0800 Subject: [PATCH 7/7] simplified max and min window api --- robotgo.go | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/robotgo.go b/robotgo.go index c4fb2b0..8dcfe11 100644 --- a/robotgo.go +++ b/robotgo.go @@ -1287,20 +1287,34 @@ func GetActive() C.MData { } // MinWindow set the window min -func MinWindow(pid int32, state bool, args ...int) { - var hwnd int +func MinWindow(pid int32, args ...interface{}) { + var ( + state = true + hwnd int + ) + if len(args) > 0 { - hwnd = args[0] + state = args[0].(bool) + } + if len(args) > 1 { + hwnd = args[1].(int) } C.min_window(C.uintptr(pid), C.bool(state), C.uintptr(hwnd)) } // MaxWindow set the window max -func MaxWindow(pid int32, state bool, args ...int) { - var hwnd int +func MaxWindow(pid int32, args ...interface{}) { + var ( + state = true + hwnd int + ) + if len(args) > 0 { - hwnd = args[0] + state = args[0].(bool) + } + if len(args) > 1 { + hwnd = args[1].(int) } C.max_window(C.uintptr(pid), C.bool(state), C.uintptr(hwnd))