查看窗口名 调用dll setForegroundWindow
2024-10-19 04:02:45
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)
}
https://github.com/golang/go/wiki/WindowsDLLs
最新文章
- js图片左右旋转
- windows服务(installutil.exe)报错。异常来自 HRESULT:0x80131515
- Web UI - Javascript之DOM Ready
- 解决 Mac Pro 用 Excel 打开 CSV 文件不能正常显示的问题
- 【转载】Pyqt 编写的俄罗斯方块
- UVA-11107 Life Forms(后缀数组)
- php discuz框架接口不能正常访问的问题
- JavaScript学习笔记 -- ES6学习(三) 变量的解构赋值
- SqlSugar框架T4模板的使用
- BHO启动IE调试
- File类常用方法
- hdu1964之插头DP求最优值
- 动态规划1-----------poj1080
- JAVA进阶21
- OpenCV-Python教程9-平滑图像
- web_app框架
- spo0lsv病毒分析
- 周强201771010141《面向对象程序设计(java)》第六周学习总结
- MySQL 5.7.16 字符串拆分 ->; 单列变多行记录(转发)
- 问题2:input、textarea、submit 宽度设置为100%,但显示宽度不一致
热门文章
- spark 系列之一 RDD的使用
- String 和 StringBuffer,StringBuilder 的区别
- 开发规范(一) 如何记录日志 By 阿里
- easyui中连接按钮样式
- Eclipse中,No compiler is provided in this environment. Perhaps you are running on a JRE rather than a
- springmvc 统一处理异常
- Qt学习笔记-中文乱码-QtWebkit显示网页乱码的问题QFont::setPixelSize: Pixel size <;= 0 (0)
- 错误总结Mapper扫描不到
- SpringBoot整合sa-token,完成网站权限验证
- case when then else end用法