diff --git a/robotgo.go b/robotgo.go index 83acb42..8dcfe11 100644 --- a/robotgo.go +++ b/robotgo.go @@ -1286,6 +1286,40 @@ func GetActive() C.MData { return mdata } +// MinWindow set the window min +func MinWindow(pid int32, args ...interface{}) { + var ( + state = true + hwnd int + ) + + if len(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, args ...interface{}) { + var ( + state = true + hwnd int + ) + + if len(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)) +} + // CloseWindow close the window func CloseWindow() { C.close_window() 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 +} diff --git a/window/goWindow.h b/window/goWindow.h index ec77960..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,6 +58,44 @@ bool is_valid(){ // return z; // } +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(); } @@ -86,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