gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:23:49 25 4
gpt4 key购买 nike

我正在尝试使用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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com