1. package main
  2.  
  3. import (
  4. "fmt"
  5. "log"
  6. "syscall"
  7. "unsafe"
  8. )
  9.  
  10. var (
  11. user32 = syscall.MustLoadDLL("user32.dll")
  12. procEnumWindows = user32.MustFindProc("EnumWindows")
  13. procGetWindowTextW = user32.MustFindProc("GetWindowTextW")
  14. )
  15.  
  16. func EnumWindows(enumFunc uintptr, lparam uintptr) (err error) {
  17. r1, _, e1 := syscall.Syscall(procEnumWindows.Addr(), 2, uintptr(enumFunc), uintptr(lparam), 0)
  18. if r1 == 0 {
  19. if e1 != 0 {
  20. err = error(e1)
  21. } else {
  22. err = syscall.EINVAL
  23. }
  24. }
  25. return
  26. }
  27.  
  28. func GetWindowText(hwnd syscall.Handle, str *uint16, maxCount int32) (len int32, err error) {
  29. r0, _, e1 := syscall.Syscall(procGetWindowTextW.Addr(), 3, uintptr(hwnd), uintptr(unsafe.Pointer(str)), uintptr(maxCount))
  30. len = int32(r0)
  31. if len == 0 {
  32. if e1 != 0 {
  33. err = error(e1)
  34. } else {
  35. err = syscall.EINVAL
  36. }
  37. }
  38. return
  39. }
  40.  
  41. func FindWindow(title string) (syscall.Handle, error) {
  42. var hwnd syscall.Handle
  43. cb := syscall.NewCallback(func(h syscall.Handle, p uintptr) uintptr {
  44. b := make([]uint16, 200)
  45. _, err := GetWindowText(h, &b[0], int32(len(b)))
  46. if err != nil {
  47. // ignore the error
  48. return 1 // continue enumeration
  49. }
  50. fmt.Printf("%s\n", syscall.UTF16ToString(b))
  51.  
  52. if syscall.UTF16ToString(b) == title {
  53. // note the window
  54. hwnd = h
  55. return 0 // stop enumeration
  56. }
  57. return 1 // continue enumeration
  58. })
  59. EnumWindows(cb, 0)
  60. if hwnd == 0 {
  61. return 0, fmt.Errorf("No window with title '%s' found", title)
  62. }
  63. return hwnd, nil
  64. }
  65.  
  66. func main() {
  67. //const title = "OpenTTD"
  68. //const title = "FileZilla FTP Client"
  69. const title = "OpenTTD"
  70. h, err := FindWindow(title)
  71. if err != nil {
  72. log.Fatal(err)
  73. }
  74. fmt.Printf("Found '%s' window: handle=0x%x\n", title, h)
  75. }

  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

  1. CandidateWindow
  2. Mode Indicator
  3. Mode Indicator
  4. 电池指示器
  5. Network Flyout
  6. Mode Indicator
  7. Mode Indicator
  8. go_win_api [Y:\dev\go_win_api] - ...\m.go - GoLand
  9. OpenTTD 1.3.0
  10. Found 'OpenTTD 1.3.0' window: handle=0x610d6
  11. CandidateWindow
  12. Mode Indicator
  13. Mode Indicator
  14. 电池指示器
  15. Network Flyout
  16. Mode Indicator
  17. Mode Indicator
  18. go_win_api [Y:\dev\go_win_api] - ...\m.go - GoLand
  19. OpenTTD 1.3.0
  20. Get Retrun Value Before setForegroundWindow Invoked: %!s(uintptr=1)

  

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "log"
  6. "syscall"
  7. "unsafe"
  8. )
  9.  
  10. var (
  11. user32 = syscall.MustLoadDLL("user32.dll")
  12. procEnumWindows = user32.MustFindProc("EnumWindows")
  13. procGetWindowTextW = user32.MustFindProc("GetWindowTextW")
  14. user32_b, _ = syscall.LoadLibrary("user32.dll")
  15. setForegroundWindow, _ = syscall.GetProcAddress(user32_b, "SetForegroundWindow")
  16. )
  17.  
  18. func EnumWindows(enumFunc uintptr, lparam uintptr) (err error) {
  19. r1, _, e1 := syscall.Syscall(procEnumWindows.Addr(), 2, uintptr(enumFunc), uintptr(lparam), 0)
  20. if r1 == 0 {
  21. if e1 != 0 {
  22. err = error(e1)
  23. } else {
  24. err = syscall.EINVAL
  25. }
  26. }
  27. return
  28. }
  29.  
  30. func GetWindowText(hwnd syscall.Handle, str *uint16, maxCount int32) (len int32, err error) {
  31. r0, _, e1 := syscall.Syscall(procGetWindowTextW.Addr(), 3, uintptr(hwnd), uintptr(unsafe.Pointer(str)), uintptr(maxCount))
  32. len = int32(r0)
  33. if len == 0 {
  34. if e1 != 0 {
  35. err = error(e1)
  36. } else {
  37. err = syscall.EINVAL
  38. }
  39. }
  40. return
  41. }
  42.  
  43. func FindWindow(title string) (syscall.Handle, error) {
  44. var hwnd syscall.Handle
  45. cb := syscall.NewCallback(func(h syscall.Handle, p uintptr) uintptr {
  46. b := make([]uint16, 200)
  47. _, err := GetWindowText(h, &b[0], int32(len(b)))
  48. if err != nil {
  49. // ignore the error
  50. return 1 // continue enumeration
  51. }
  52. fmt.Printf("%s\n", syscall.UTF16ToString(b))
  53.  
  54. if syscall.UTF16ToString(b) == title {
  55. // note the window
  56. hwnd = h
  57. return 0 // stop enumeration
  58. }
  59. return 1 // continue enumeration
  60. })
  61. EnumWindows(cb, 0)
  62. if hwnd == 0 {
  63. return 0, fmt.Errorf("No window with title '%s' found", title)
  64. }
  65. return hwnd, nil
  66. }
  67.  
  68. func IntPtr(n int) uintptr {
  69. return uintptr(n)
  70. }
  71.  
  72. func abort(funcname string, err syscall.Errno) {
  73. panic(funcname + " failed: " + err.Error())
  74. }
  75.  
  76. func main() {
  77. //const title = "OpenTTD"
  78. //const title = "FileZilla FTP Client"
  79. const title = "OpenTTD 1.3.0"
  80. h, err := FindWindow(title)
  81. if err != nil {
  82. log.Fatal(err)
  83. }
  84. fmt.Printf("Found '%s' window: handle=0x%x\n", title, h)
  85.  
  86. h, err = FindWindow(title)
  87. if err != nil {
  88. log.Fatal(err)
  89. }
  90.  
  91. ret, _, callErr := syscall.Syscall(setForegroundWindow, 1, uintptr(h), IntPtr(0), IntPtr(0))
  92. if callErr != 0 {
  93. abort("Call setForegroundWindow", callErr)
  94. }
  95. fmt.Printf("Get Retrun Value Before setForegroundWindow Invoked: %s\n", ret)
  96. }

  

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

查看窗口名 调用dll setForegroundWindow的更多相关文章

  1. php调用dll经验小结

    最近做一个网站,需要频繁使用远程数据,数据接口已经做好.在做转换的时候遇到了性能上的问题:开始打算用php来实现转换,苦苦查了数天,都没有找到直接操作字节的方法.虽然可以使用 pack() 方法将各个 ...

  2. 摘: VS2010 C++ 调用 DLL (C++编写)

    一.为什么需要dll 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用. 比较常见的例子是各种应用程序框架,如ATL. ...

  3. C#程序实现动态调用DLL的研究(转)

    摘 要:在<csdn开发高手>2004年第03期中的<化功大法——将DLL嵌入EXE>一文,介绍了如何把一个动态链接库作为一个资源嵌入到可执行文件,在可执行文件运行时,自动从资 ...

  4. 在VC中创建并调用DLL

    转自:http://express.ruanko.com/ruanko-express_45/technologyexchange6.html 一.DLL简介 1.什么是DLL? 动态链接库英文为DL ...

  5. 在 C++Builder 工程里调用 DLL 函数

    调用 Visual C++ DLL 给 C++Builder 程序员提出了一些独特的挑战.在我们试图解决 Visual C++ 生成的 DLL 之前,回顾一下如何调用一个 C++Builder 创建的 ...

  6. VB6.0调用DLL

    目录 第1章 VB6.0调用DLL    1 1 VC++编写DLL    1 1.1 使用__stdcall    1 1.2 使用 .DEF 文件    1 2 简单数据类型    2 2.1 传 ...

  7. 在VS2012中采用C++中调用DLL中的函数 (4)

    这两天因为需要用到VS2012来生成一个DLL代码,但是之前并没有用过DLL相关的内容,从昨天开始尝试调试DLL的文件调用,起初笔者在网络上找到了3片采用VSXXX版本进行调试的例子,相关的内容见本人 ...

  8. 在C++中调用DLL中的函数 (3)

    1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...

  9. 在C++中调用DLL中的函数 (2)

    应用程序使用DLL可以采用两种方式: 一种是隐式链接,另一种是显式链接.在使用DLL之前首先要知道DLL中函数的结构信息. Visual C++6.0在VC\bin目录下提供了一个名为Dumpbin. ...

随机推荐

  1. 关于Git的一些常规操作

    最近刚换了新的办公电脑,Git有重新安装了一遍,很多步骤久了不操作就忘了,又是好一顿折腾,于是这次就顺便记下来了. 不错的Git教程: https://www.liaoxuefeng.com/wiki ...

  2. ipython快捷键

    IPython Notebook有两种不同的键盘输入模式(编辑模式和命令模式). 编辑模式:允许你输入代码或者文本到一个单元格(cell这里我译作单元格)内,并且单元格外面有灰色的选中框(注:Jupy ...

  3. [LeetCode]313. Super Ugly Number超级丑数,丑数系列看这一道就行了

    丑数系列的题看这一道就可以了 /* 和ugly number2差不多,不过这次的质因子多了,所以用数组来表示质因子的target坐标 target坐标指的是这个质因子此次要乘的前任丑数是谁 */ pu ...

  4. CentOS 8 安装mysql8.0.21

    1.使用dnf安装mysql(遇到暂停按y)dnf install @mysql 2.安装完成使用下面命令启动MySQL服务systemctl enable --now mysqld 3.查看服务是否 ...

  5. 高性能MySQL学习总结二----常见数据类型选择及优化

    一.数据类型的选择 MySQL的数据类型有很多种,选择正确的数据类型对于获得高性能特别地重要,如何选择合适的数据类型呢?主要遵从以下三个原则: 1.更小的通常情况下性能更好 一般情况下,应该尽量使用可 ...

  6. 使用 SOS 对 Linux 中运行的 .NET Core 进行问题诊断

    目录 说明 准备一个方便的学习环境 2.x 配置内容 3.x 配置内容 工具介绍 lldb sos plugin 1. attach 到进程上进行调试 2. 分析core dump文件 SOS 案例分 ...

  7. SSM整合详解

    1.基本概念 1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One ...

  8. spring boot 部署到tomcat

    网上很多文章描述过,当我按步骤做时会抛各种错误,最后记录下我的做法(成功发布到本地 Tomcat9 ): 1.将项目的启动类Application.java继承SpringBootServletIni ...

  9. java使用正则的例子

    package com.accord.util; import java.util.ArrayList; import java.util.List; import java.util.regex.M ...

  10. 不吹不黑,jupyter lab 3.0客观使用体验

    1 简介 jupyter lab于近期发布了其具有里程碑意义的3.0版本,随之带来的一些重要新特性,想必广大读者朋友已在各大公众号所翻译转载的jupyter lab团队官方介绍文章中知晓了很多. 图1 ...