【问题标题】:HWND by process name (no windowname)HWND 按进程名称(无窗口名称)
【发布时间】:2018-03-18 12:06:25
【问题描述】:

是否可以通过进程名称从窗口中获取HWND? 每次重新启动时窗口的名称都会更改(随机窗口名称),如下所示:

我刚刚找到了一些可以通过窗口名称获取它的东西。

【问题讨论】:

标签: c++ winapi


【解决方案1】:

进程和窗口之间的联系并不明显。首先,一个进程可以有多个窗口。其次,Windows API 似乎没有提供基于进程查找窗口的方法(我觉得这很奇怪,因为您的屏幕截图显示了这一点)。

但是,您可以通过所有打开的窗口并根据进程进行过滤。请参阅此问题并详细解答如何操作:Find Window and change it's name

【讨论】:

    【解决方案2】:

    我找到了这个解决方案,但是我得到了一个进程 ID 的多个 HWND

    #include <Windows.h>
    
    void GetAllWindowsFromProcessID(DWORD searchPID, std::vector <HWND> &wnds)
    {
        HWND hCurWnd = NULL;
        do
        {
            hCurWnd = FindWindowEx(NULL, hCurWnd, NULL, NULL);
            DWORD processID = 0;
            GetWindowThreadProcessId(hCurWnd, &processID);
            if (searchPID == processID)
            {
                wnds.push_back(hCurWnd);
            }
        } while (hCurWnd != NULL);
    }
    
    int main()
    {
        DWORD PID = 0x00001D7C;
        std::vector<HWND> HWND_List;
        GetAllWindowsFromProcessID(PID, HWND_List);
    
        return 0;
    }
    

    【讨论】:

    • 是的,槽代码,我刚刚发现,通过窗口名称获取它,但它是随机的-.-
    • 您想改用EnumWindows。此外,发布您不理解的代码几乎不会产生高质量的答案。这个肯定不是。
    • 这很有帮助,得到了相同的结果,多个 HWND,我发现第二个索引包含窗口的正确 HWND。
    • @rck:您正在寻找枚举顶级窗口。 EnumWindows 确实如此。这个解决方案没有。而且它受到竞争条件的影响,这会在某个时候打击你。与往常一样,如果有人不知道,为什么他们的(是吗,真的吗?)代码有效,但事实并非如此。如果只是因为缺乏任何解释,请不要接受这个答案。
    猜你喜欢
    • 2011-10-12
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多