尝试运行以下代码时遇到问题:
#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子系统下运行它。
答案 0 :(得分:3)
根据GetCurrentProcessId
docs,API
另一方面,检索调用进程的进程标识符。
检索创建指定窗口的线程的标识符,以及可选的创建窗口的进程的标识符。
返回值是创建窗口的线程的标识符。
看着你的电话:
pid = GetWindowThreadProcessId(hwnd, NULL);
您实际上正在获取线程ID,而不是进程ID。因此,当您将pid
与id
进行比较时,您需要比较进程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;
}