C++ C++;:通过进程id、进程句柄和标题名从进程中获取唯一窗口的窗口句柄的最佳方法

C++ C++;:通过进程id、进程句柄和标题名从进程中获取唯一窗口的窗口句柄的最佳方法,c++,winapi,window-handles,C++,Winapi,Window Handles,我正在寻找在以下情况下获得窗口句柄的最佳方法: 我有进程id和进程句柄,我知道窗口标题名,我知道进程只有一个窗口 那我该怎么做呢FindWindow枚举窗口?使用需要知道窗口类或窗口标题。这两者并不一定都是独一无二的。由于您已经读取了流程句柄(及其ID),因此可以使用实现一个健壮的解决方案 首先,声明用于通信的结构。它将进程ID传递给枚举过程并返回窗口句柄 // Structure used to communicate data from and to enumeration procedur

我正在寻找在以下情况下获得窗口句柄的最佳方法:
我有进程id进程句柄,我知道窗口标题名,我知道进程只有一个窗口

那我该怎么做呢<代码>FindWindow<代码>枚举窗口?

使用需要知道窗口类或窗口标题。这两者并不一定都是独一无二的。由于您已经读取了流程句柄(及其ID),因此可以使用实现一个健壮的解决方案

首先,声明用于通信的结构。它将进程ID传递给枚举过程并返回窗口句柄

// Structure used to communicate data from and to enumeration procedure
struct EnumData {
    DWORD dwProcessId;
    HWND hWnd;
};
接下来,我们需要一个回调过程来检索任何给定窗口的进程ID(),并将其与我们要查找的窗口进行比较:

// Application-defined callback for EnumWindows
BOOL CALLBACK EnumProc( HWND hWnd, LPARAM lParam ) {
    // Retrieve storage location for communication data
    EnumData& ed = *(EnumData*)lParam;
    DWORD dwProcessId = 0x0;
    // Query process ID for hWnd
    GetWindowThreadProcessId( hWnd, &dwProcessId );
    // Apply filter - if you want to implement additional restrictions,
    // this is the place to do so.
    if ( ed.dwProcessId == dwProcessId ) {
        // Found a window matching the process ID
        ed.hWnd = hWnd;
        // Report success
        SetLastError( ERROR_SUCCESS );
        // Stop enumeration
        return FALSE;
    }
    // Continue enumeration
    return TRUE;
}
剩下的是公共界面。它填充用于与进程ID通信的结构,触发顶级窗口的枚举,并返回窗口句柄。对和的调用是必需的,因为在这种情况下,
EnumWindows
返回
FALSE
,表示错误和成功:

// Main entry
HWND FindWindowFromProcessId( DWORD dwProcessId ) {
    EnumData ed = { dwProcessId };
    if ( !EnumWindows( EnumProc, (LPARAM)&ed ) &&
         ( GetLastError() == ERROR_SUCCESS ) ) {
        return ed.hWnd;
    }
    return NULL;
}

// Helper method for convenience
HWND FindWindowFromProcess( HANDLE hProcess ) {
    return FindWindowFromProcessId( GetProcessId( hProcess ) );
}
这将检索与给定流程ID匹配的第一个顶级窗口。因为需求声明给定流程只有一个窗口,所以第一个匹配的窗口是正确的窗口


如果存在其他限制,
EnumProc
可以扩展以包括这些限制。我已经在上面的实现中标记了可以应用额外过滤器的位置。

是的,
EnumWindows
是您的朋友。这和效率有什么关系?你需要每秒做几百万次吗?我只是想学会用正确的方法做。这有什么问题吗?一点也不。这是正确的方法。顺便说一句,这不是重复的。我可不想找什么办法弄到窗把手!我在为我的特殊情况寻找最好的方法。。。所以EnumWindows是最有效的是吗?它是重复的。您的具体案例与链接问题中的案例相同,但附加的限制并不起作用。但是,对上一个问题的回答只提供了基本的指导,而不是一个功能齐全的解决方案,因此不应关闭此问题。