Получение идентификатора процесса через EnumWindows ... Может кто-нибудь объяснить, почему этот код работает? - PullRequest
0 голосов
/ 17 февраля 2019

Я пытаюсь получить дескрипторы окон.Затем я пытался получить связанный идентификатор процесса для каждого дескриптора.Но каким-то образом я волшебным образом получаю process_id из ниоткуда.Пожалуйста, направьте меня сюда.

Если я пытаюсь инициализировать process_id с помощью функции GetWindowThreadProcessId (), я сталкиваюсь с ошибкой во время выполнения.Однако, если я закомментирую эту часть кода и позволю процессу process_id печатать в обеих функциях printf (), программы будут работать успешно, отображать данные и корректно завершать работу.Здесь должно быть значение мусора.

#include <stdio.h>
#include <windows.h>

WNDENUMPROC DisplayData(HWND str, LPARAM p) {
    LPDWORD process_id;
    DWORD P_ID;
    printf("PID :: %x\n", process_id);

    //this is where error occurs
    //P_ID = GetWindowThreadProcessId(str, process_id);

    printf("Found: %x, P_ID: %x\n", str, process_id);
    return TRUE;
}

int main() {
    EnumWindows( (WNDENUMPROC) DisplayData, 1);
    return 0;
}

1 Ответ

0 голосов
/ 17 февраля 2019
#include <stdio.h>
#include <windows.h>

LPDWORD target = (LPDWORD) 0;  // Replace 0 with PID of the task from taskmgr.
HWND target_handle = NULL;  // stores the handle of the target process

WNDENUMPROC DisplayData(HWND str, LPARAM p) {
    LPDWORD thread_id;
    DWORD process_id;
    char title[30];

    GetWindowTextA(str, (LPSTR) &title, 29);
    process_id = GetWindowThreadProcessId(str, (PDWORD) &thread_id);

    if( thread_id == target & IsWindowVisible(str) ) {
        // Target thread with associated handle
        // printf("Handle Addr: %lu, Thread ID: %lu, Process ID: %lu, Title: %s\n", str, thread_id, process_id, title );
        target_handle = str;
    }

    return TRUE;
}

int main() {
    EnumWindows( (WNDENUMPROC) DisplayData, 1);

    ShowWindow(target_handle, SW_HIDE);
    Sleep(1000);
    ShowWindow(target_handle, SW_SHOW);

    return 0;
}

Идентификатор потока, показанный этим кодом, отображается в диспетчере задач как PID.Переменная target_handle содержит адрес дескриптора после выполнения функции EnumWindows (), так же, как и требуется.

...