查看窗口名 调用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)
}

  https://stackoverflow.com/questions/19436860/go-golang-trying-to-get-window-information-via-syscall-as-in-enumwindows-etc

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)
}

  

 

 

 

https://github.com/golang/go/wiki/WindowsDLLs

posted @ 2020-01-15 17:35  papering  阅读(511)  评论(0编辑  收藏  举报