枚举窗口时出现问题

时间:2014-04-07 22:56:12

标签: c++ windows winapi

尝试运行以下代码时遇到问题:

#include "header.h"

int main()
{
    id = GetCurrentProcessId();
    EnumWindows(hEnumWindows, NULL);

    Sleep(5000);
    //MoveWindow(hThis, 450, 450, 100, 100, TRUE);

    system("pause");
    return 0;
}

//header.h

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <Windows.h>

using namespace std;

DWORD id = 0;
HWND hThis = NULL;

BOOL CALLBACK hEnumWindows(HWND hwnd, LPARAM lParam)
{
    DWORD pid = 0;
    pid = GetWindowThreadProcessId(hwnd, NULL);

    if (pid == id)
    {
        hThis = GetWindow(hwnd, GW_OWNER);
        if (!hThis)
        {
            cout << "Error getting window!" << endl;
        }
        else
        {
            char *buffer = nullptr;
            int size = GetWindowTextLength(hThis);
            buffer = (char*)malloc(size+1);
            if (buffer != nullptr)
            {
                GetWindowText(hThis, buffer, size);
                cout << pid << ":" << buffer << endl;
                free(buffer);
            }
        }
    }

    return TRUE;
}

当我运行此代码时,几乎没有任何内容输出到屏幕,就像没有附加程序一样。我尝试在VS2013中的控制台和Windows子系统下运行它。

2 个答案:

答案 0 :(得分:3)

根据GetCurrentProcessId docs,API

  

检索调用进程的进程标识符。

另一方面,

GetWindowThreadProcessId

  

检索创建指定窗口的线程的标识符,以及可选的创建窗口的进程的标识符。

     

返回值是创建窗口的线程的标识符。

看着你的电话:

pid = GetWindowThreadProcessId(hwnd, NULL);

您实际上正在获取线程ID,而不是进程ID。因此,当您将pidid进行比较时,您需要比较进程ID和线程ID,而这只是不起作用。试试这个:

GetWindowThreadProcessId(hwnd, &pid);

(注意:我实际上无法测试这是否有效,因为EnumWindows需要一个顶级窗口进行枚举,我将其作为控制台应用程序运行。请告诉我这个答案是否为&#39 ;为你工作,我将删除它。)

(作为第二个注释,您不再需要使用NULL,即使对于像HWND这样的WinAPI内容也是如此。nullptr将完全正常。)

答案 1 :(得分:0)

我假设您正在尝试从ProcessID中找到“Main”窗口。在这种情况下,这可能会有所帮助:

#include "stdafx.h"
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <Windows.h>

struct WindowHandleStructure
{
    unsigned long PID;
    HWND WindowHandle;
};

BOOL CALLBACK EnumWindowsProc(HWND WindowHandle, LPARAM lParam)
{
    unsigned long PID = 0;
    WindowHandleStructure* data = reinterpret_cast<WindowHandleStructure*>(lParam);

    GetWindowThreadProcessId(WindowHandle, &PID);
    if (data->PID != PID || (GetWindow(WindowHandle, GW_OWNER) && !IsWindowVisible(WindowHandle)))
    {
        return TRUE;
    }
    data->WindowHandle = WindowHandle;
    return FALSE;
}

HWND FindMainWindow(unsigned long PID)
{
    WindowHandleStructure data = { PID, nullptr };
    EnumWindows(EnumWindowsProc, reinterpret_cast<LPARAM>(&data));
    return data.WindowHandle;
}

int main()
{
    HWND Window = FindMainWindow(GetCurrentProcessId());

    std::wstring Buffer(GetWindowTextLength(Window) + 1, L'\0');
    GetWindowText(Window, &Buffer[0], Buffer.size());

    std::wcout << Buffer.c_str() << L"\n";

    system("pause");
    return 0;
}