枚举窗口时发生

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

#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子系统下运行它。

Solutions Collecting From Web of "枚举窗口时发生"

根据GetCurrentProcessId文档 ,API

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

GetWindowThreadProcessId ,另一方面,

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

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

所以看着你的电话:

 pid = GetWindowThreadProcessId(hwnd, NULL); 

你实际上得到一个线程ID,而不是一个进程ID。 所以当你把pidid进行比较的时候,你正在比较一个进程标识和一个线程标识,而这只是不起作用。 试试这个:

 GetWindowThreadProcessId(hwnd, &pid); 

(注意:我实际上不能测试这是否工作,因为EnumWindows需要一个顶级窗口来枚举,我作为一个控制台应用程序运行它。让我知道如果这个答案不适合你,我会删除它。)

(作为第二个注意事项,你不需要再使用NULL ,即使对于像HWND这样的WinAPI, nullptr也能正常工作。)

我假设你正在尝试从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; }