社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
使用Windows系统提供的API 函数,可以实现很多强大的功能,如操作窗口、机器人自动处理等。
以前经常使用VC、VB语言做类似的事。现在喜欢使用golang做系统开发,如果能用golang调用系统API,我就不需要在电脑上安装VB了,那个好老的东西,在win10中居然不能好好工作。我想忘掉它了。虽然以前我用它写了无数的代码。
经过搜索查找,发现github.com/lxn/win 是个好东西,提供很多系统调用功能。用它写代码基本上很舒服。
但是当我找 FindWindowEx 时,居然没有提供,只有FindWindow。
一开始,我想人家没提供可能不行吧,也许这个API不能好好工作,有什么难言之隐吧。
只能用EnumChildWindows 代替它,来做所有控件查找工作。后来感觉不够,于是决定偿试自己搞个 FindWindowEx。
没想到成了,居然能好好工作,列出来,供大家使用:
修改文件:srcgithub.comlxnwinuser32.go
// here: findWindow *windows.LazyProc
findWindowEx *windows.LazyProc
// here: findWindow = libuser32.NewProc("FindWindowW")
findWindowEx = libuser32.NewProc("FindWindowExW")
//here: func FindWindow(lpClassName, lpWindowName *uint16) HWND {
// add by rhinosharp team
func FindWindowEx(hWndParent HWND, hWndChild HWND, lpClassName, lpWindowName *uint16) HWND {
ret, _, _ := syscall.Syscall6(findWindowEx.Addr(), 4,
uintptr(hWndParent),
uintptr(hWndChild),
uintptr(unsafe.Pointer(lpClassName)),
intptr(unsafe.Pointer(lpWindowName)),
0,
0)
return HWND(ret)
}
已经向https://github.com/lxn/win作了递交:
包装一下,方便调用:
// StringToUTF16PtrElseNil String To UTF16Ptr if empty string trans to nil
func StringToUTF16PtrElseNil(str string) *uint16 {
if str == "" {
return nil
}
return syscall.StringToUTF16Ptr(str)
}
// FindWindow find window hwnd by name class="" if nil,nil mean ignore it
func FindWindow(class, title string) win.HWND {
var hwnd win.HWND
hwnd = win.FindWindow(StringToUTF16PtrElseNil(class), StringToUTF16PtrElseNil(title))
return hwnd
}
// FindWindowEx find window hwnd by name class="" if nil,nil mean ignore it
func FindWindowEx(hWndParent, hWndChild win.HWND, class, title string) win.HWND {
var hwnd win.HWND
hwnd = win.FindWindowEx(hWndParent, hWndChild,
StringToUTF16PtrElseNil(class),
StringToUTF16PtrElseNil(title))
return hwnd
}
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!