go - 从GetWindowThreadProcessId调用返回的PID与TaskManager的PID不匹配

标签 go winapi

我正在尝试使用Go获取Windows 10上 Activity 前景窗口的PID。

首先,我调用此函数并获取句柄:

func GetForegroundWindow() uintptr {
    us32 := syscall.MustLoadDLL("user32.dll")
    prc := us32.MustFindProc("GetForegroundWindow")
    ret, _, _ := prc.Call()
    return ret
}

稍后使用从上述函数返回的句柄,我将其称为:
func GetWindowThreadProcessId(hwnd uintptr) uintptr {
    us32 := syscall.MustLoadDLL("user32.dll")
    prc := us32.MustFindProc("GetWindowThreadProcessId")
    ret, _, err := prc.Call(hwnd, uintptr(unsafe.Pointer(&hwnd)))
    fmt.Println("ProcessId: ", ret, " Error: ", err)
    return ret
}

当我通过运行任务列表/ fi“pid eq returnPid”交叉检查返回的PID时,它与任何进程都不匹配。

而且对OpenProcess的调用始终返回0,并显示错误消息“参数不正确”。
func GetOpenProcess(pid uintptr) {
    kernel32 := syscall.MustLoadDLL("kernel32.dll")
    proc := kernel32.MustFindProc("OpenProcess")
    res, _, err := proc.Call(ptr(PROCESS_ALL_ACCESS|PROCESS_QUERY_INFO), ptr(true), ptr(pid))
    fmt.Println("OpenProcess: result:", res, " Error:", err)
}

我究竟做错了什么?

最佳答案

我能够根据https://stackoverflow.com/users/1889329/iinspectable的评论解决此问题

我做错的是,尝试使用syscall返回的值,并且我将指向窗口句柄的指针作为第二个参数传递给GetWindowThreadProcessId()函数,这也是错误的。相反,必须使用来获取 Activity 窗口进程ID,我必须传递一个新的指针(第二个参数)并在函数返回后使用该指针的值代替返回的值。因为,GetWindowThreadProcessId函数将PID写入第二个参数指向的位置。

请在下面找到修改后的代码:

func GetWindowThreadProcessId(hwnd uintptr) uintptr {
    var prcsId uintptr = 0
    us32 := syscall.MustLoadDLL("user32.dll")
    prc := us32.MustFindProc("GetWindowThreadProcessId")
    ret, _, err := prc.Call(hwnd, uintptr(unsafe.Pointer(&prcsId)))
    log.Println("ProcessId: ", prcsId, "ret", ret, " Message: ", err)
    return prcsId
}

功能日志:
2020/04/18 14:31:21 ProcessId: 13652 ret 13644消息:操作成功完成。

enter image description here

关于go - 从GetWindowThreadProcessId调用返回的PID与TaskManager的PID不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61246529/

相关文章:

go - 用于接口(interface)及其实现的自定义 UnmarshalYAML 接口(interface)

Go - 下载前缀下的 S3 文件

c - WinHttpSendRequest 返回 ERROR_INVALID_PARAMETER

windows - 注册表拦截的替代方案

c++ - 带有 WH_MOUSE 和 TrackMouseEvent 的 SetWindowsHookEx 不捕获 WM_MOUSELEAVE

php - http.newRequest 不发送发布数据

go - 眼镜蛇PersistentPreRun堆栈溢出

c++ - 如何获取USN期刊查询的完整路径?

c# - 需要一种更改远程用户密码的方法 - NetUserChangePassword 失败并返回 2245

Docker Golang SDK - 如何将容器标准输出重定向到文件