簡體   English   中英

通過EnumWindows獲取進程ID…有人可以向我解釋為什么此代碼有效嗎?

[英]Getting process id via EnumWindows… Can someone please explain me why this code is working?

我正在嘗試獲取Windows的句柄。 然后,我試圖獲取每個句柄的關聯進程ID。 但是不知何故,我神奇地獲得了process_id。 請在這里指導我。

如果嘗試使用GetWindowThreadProcessId()函數初始化process_id,則會遇到運行時錯誤。 但是,如果我注釋掉那部分代碼並在兩個printf()函數中讓process_id打印,程序將成功運行,顯示數據並干凈地退出。 這里應該是垃圾值。

#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;
}
#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;
}

此代碼顯示的線程ID是在任務管理器中顯示為PID的線程ID。 正如需要的那樣,target_handle變量包含在執行EnumWindows()函數之后的句柄地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM