PID, возвращенный из вызова GetWindowThreadProcessId, не совпадает с PID из TaskManager - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь получить PID активного окна переднего плана на windows 10, используя Go.

, сначала я вызываю эту функцию и получаю дескриптор:

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
}

Когда я проверяю возвращенный PID, запустив tasklist / fi "pid eq returnPid", он не соответствует ни одному процессу.

И вызов 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)
}

что я делаю не так?

1 Ответ

0 голосов
/ 18 апреля 2020

Мне удалось решить проблему на основе комментария от { ссылка }

Что я делал неправильно, пытался использовать значение, возвращаемое из syscall, и я передавал указатель на дескриптор окна в качестве второго параметра функции GetWindowThreadProcessId (), что также неверно. Вместо этого , чтобы получить идентификатор процесса Active Window, мне пришлось передать новый указатель (второй аргумент) и использовать значение из этого указателя после того, как функция вернется вместо возвращенного значения . Потому что функция 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...