首頁 >後端開發 >C++ >如何從 .NET 和 C 中的進程 ID 取得主視窗句柄?

如何從 .NET 和 C 中的進程 ID 取得主視窗句柄?

Barbara Streisand
Barbara Streisand原創
2024-12-11 19:34:12490瀏覽

How Can I Get a Main Window Handle from a Process ID in .NET and C  ?

從進程ID 擷取主視窗句柄

為了將特定視窗帶到前台,了解如何取得其來自其流程ID 的主窗口句柄至關重要。此過程通常用於管理視窗並使它們成為焦點。

使用 .NET 和 EnumWindows() 的解決方案

存在利用 EnumWindows() 的 .NET 實作來識別主視窗。此函數枚舉系統中的所有頂級窗口,讓您可以找到與特定進程關聯的窗口。

C 程式碼實作

這是一段C 程式碼片段示範了與.NET 實作相同的方法:

struct handle_data {
    unsigned long process_id;
    HWND window_handle;
};

HWND find_main_window(unsigned long process_id)
{
    handle_data data;
    data.process_id = process_id;
    data.window_handle = 0;
    EnumWindows(enum_windows_callback, (LPARAM)&data);
    return data.window_handle;
}

BOOL CALLBACK enum_windows_callback(HWND handle, LPARAM lParam)
{
    handle_data& data = *(handle_data*)lParam;
    unsigned long process_id = 0;
    GetWindowThreadProcessId(handle, &process_id);
    if (data.process_id != process_id || !is_main_window(handle))
        return TRUE;
    data.window_handle = handle;
    return FALSE;   
}

BOOL is_main_window(HWND handle)
{   
    return GetWindow(handle, GW_OWNER) == (HWND)0 && IsWindowVisible(handle);
}

此程式碼建立一個回調函數,用於檢查進程ID每個視窗及其可見性狀態以確定它是否是主視窗。如果符合指定的進程 ID 和可見性條件,則視窗句柄將儲存在 handle_data 結構中。

透過使用此回呼函數呼叫 EnumWindows(),您可以迭代所有頂級窗口,識別主窗口window來尋找指定的進程ID,並取得其句柄。然後可以使用該句柄將視窗置於前面或執行其他與視窗相關的操作。

以上是如何從 .NET 和 C 中的進程 ID 取得主視窗句柄?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn