查看窗口名 调用dll setForegroundWindow
package main
import (
	"fmt"
	"log"
	"syscall"
	"unsafe"
)
var (
	user32             = syscall.MustLoadDLL("user32.dll")
	procEnumWindows    = user32.MustFindProc("EnumWindows")
	procGetWindowTextW = user32.MustFindProc("GetWindowTextW")
)
func EnumWindows(enumFunc uintptr, lparam uintptr) (err error) {
	r1, _, e1 := syscall.Syscall(procEnumWindows.Addr(), 2, uintptr(enumFunc), uintptr(lparam), 0)
	if r1 == 0 {
		if e1 != 0 {
			err = error(e1)
		} else {
			err = syscall.EINVAL
		}
	}
	return
}
func GetWindowText(hwnd syscall.Handle, str *uint16, maxCount int32) (len int32, err error) {
	r0, _, e1 := syscall.Syscall(procGetWindowTextW.Addr(), 3, uintptr(hwnd), uintptr(unsafe.Pointer(str)), uintptr(maxCount))
	len = int32(r0)
	if len == 0 {
		if e1 != 0 {
			err = error(e1)
		} else {
			err = syscall.EINVAL
		}
	}
	return
}
func FindWindow(title string) (syscall.Handle, error) {
	var hwnd syscall.Handle
	cb := syscall.NewCallback(func(h syscall.Handle, p uintptr) uintptr {
		b := make([]uint16, 200)
		_, err := GetWindowText(h, &b[0], int32(len(b)))
		if err != nil {
			// ignore the error
			return 1 // continue enumeration
		}
		fmt.Printf("%s\n", syscall.UTF16ToString(b))
		if syscall.UTF16ToString(b) == title {
			// note the window
			hwnd = h
			return 0 // stop enumeration
		}
		return 1 // continue enumeration
	})
	EnumWindows(cb, 0)
	if hwnd == 0 {
		return 0, fmt.Errorf("No window with title '%s' found", title)
	}
	return hwnd, nil
}
func main() {
	//const title = "OpenTTD"
	//const title = "FileZilla FTP Client"
	const title = "OpenTTD"
	h, err := FindWindow(title)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Found '%s' window: handle=0x%x\n", title, h)
}
Go/Golang Trying to get window information via syscall. (As in EnumWindows, etc.) - Stack Overflow - Google Chrome
任务管理器
OpenTTD 1.3.0
openttd.exe 属性
filezilla.exe 属性
OfficePowerManagerWindow
game_manager [Y:\dev\game_manager] - C:\Go\src\os\exec\exec.go - GoLand
CandidateWindow Mode Indicator Mode Indicator 电池指示器 Network Flyout Mode Indicator Mode Indicator go_win_api [Y:\dev\go_win_api] - ...\m.go - GoLand OpenTTD 1.3.0 Found 'OpenTTD 1.3.0' window: handle=0x610d6 CandidateWindow Mode Indicator Mode Indicator 电池指示器 Network Flyout Mode Indicator Mode Indicator go_win_api [Y:\dev\go_win_api] - ...\m.go - GoLand OpenTTD 1.3.0 Get Retrun Value Before setForegroundWindow Invoked: %!s(uintptr=1)
package main
import (
	"fmt"
	"log"
	"syscall"
	"unsafe"
)
var (
	user32                 = syscall.MustLoadDLL("user32.dll")
	procEnumWindows        = user32.MustFindProc("EnumWindows")
	procGetWindowTextW     = user32.MustFindProc("GetWindowTextW")
	user32_b, _            = syscall.LoadLibrary("user32.dll")
	setForegroundWindow, _ = syscall.GetProcAddress(user32_b, "SetForegroundWindow")
)
func EnumWindows(enumFunc uintptr, lparam uintptr) (err error) {
	r1, _, e1 := syscall.Syscall(procEnumWindows.Addr(), 2, uintptr(enumFunc), uintptr(lparam), 0)
	if r1 == 0 {
		if e1 != 0 {
			err = error(e1)
		} else {
			err = syscall.EINVAL
		}
	}
	return
}
func GetWindowText(hwnd syscall.Handle, str *uint16, maxCount int32) (len int32, err error) {
	r0, _, e1 := syscall.Syscall(procGetWindowTextW.Addr(), 3, uintptr(hwnd), uintptr(unsafe.Pointer(str)), uintptr(maxCount))
	len = int32(r0)
	if len == 0 {
		if e1 != 0 {
			err = error(e1)
		} else {
			err = syscall.EINVAL
		}
	}
	return
}
func FindWindow(title string) (syscall.Handle, error) {
	var hwnd syscall.Handle
	cb := syscall.NewCallback(func(h syscall.Handle, p uintptr) uintptr {
		b := make([]uint16, 200)
		_, err := GetWindowText(h, &b[0], int32(len(b)))
		if err != nil {
			// ignore the error
			return 1 // continue enumeration
		}
		fmt.Printf("%s\n", syscall.UTF16ToString(b))
		if syscall.UTF16ToString(b) == title {
			// note the window
			hwnd = h
			return 0 // stop enumeration
		}
		return 1 // continue enumeration
	})
	EnumWindows(cb, 0)
	if hwnd == 0 {
		return 0, fmt.Errorf("No window with title '%s' found", title)
	}
	return hwnd, nil
}
func IntPtr(n int) uintptr {
	return uintptr(n)
}
func abort(funcname string, err syscall.Errno) {
	panic(funcname + " failed: " + err.Error())
}
func main() {
	//const title = "OpenTTD"
	//const title = "FileZilla FTP Client"
	const title = "OpenTTD 1.3.0"
	h, err := FindWindow(title)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Found '%s' window: handle=0x%x\n", title, h)
	h, err = FindWindow(title)
	if err != nil {
		log.Fatal(err)
	}
	ret, _, callErr := syscall.Syscall(setForegroundWindow, 1, uintptr(h), IntPtr(0), IntPtr(0))
	if callErr != 0 {
		abort("Call setForegroundWindow", callErr)
	}
	fmt.Printf("Get Retrun Value Before setForegroundWindow Invoked: %s\n", ret)
}
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号