当前位置: 首页 > news >正文

从pid获取exe窗口名称

从pid获取exe窗口名称

// GetWindowTitleByPID.cpp
#include <windows.h>
#include <iostream>
#include <vector>
#include <string>
#include <iomanip>
#include <psapi.h>#pragma comment(lib, "user32.lib")
#pragma comment(lib, "psapi.lib")// 结构体存储窗口信息
struct WindowInfo {HWND hwnd;DWORD pid;std::wstring title;std::wstring className;bool isVisible;bool isEnabled;
};// 回调函数:枚举窗口
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) {std::vector<WindowInfo>* windows = reinterpret_cast<std::vector<WindowInfo>*>(lParam);DWORD processId = 0;GetWindowThreadProcessId(hwnd, &processId);// 获取窗口标题wchar_t title[256] = {0};GetWindowTextW(hwnd, title, 256);// 获取窗口类名wchar_t className[256] = {0};GetClassNameW(hwnd, className, 256);// 检查窗口状态bool isVisible = IsWindowVisible(hwnd) != 0;bool isEnabled = IsWindowEnabled(hwnd) != 0;// 保存窗口信息
    WindowInfo info;info.hwnd = hwnd;info.pid = processId;info.title = title;info.className = className;info.isVisible = isVisible;info.isEnabled = isEnabled;windows->push_back(info);return TRUE; // 继续枚举
}// 根据PID获取进程名
std::wstring GetProcessName(DWORD pid) {HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);if (hProcess == NULL) {return L"无法访问进程";}wchar_t processName[MAX_PATH] = {0};if (GetModuleFileNameExW(hProcess, NULL, processName, MAX_PATH) == 0) {CloseHandle(hProcess);return L"未知进程";}CloseHandle(hProcess);// 提取文件名(去掉路径)std::wstring fullPath = processName;size_t lastSlash = fullPath.find_last_of(L"\\/");if (lastSlash != std::wstring::npos) {return fullPath.substr(lastSlash + 1);}return fullPath;
}// 主函数
int main() {// 设置控制台编码为UTF-8,支持中文
    SetConsoleOutputCP(CP_UTF8);SetConsoleCP(CP_UTF8);std::cout << "=== 通过PID获取窗口标题工具 ===\n";std::cout << "输入PID(输入0退出程序)\n";while (true) {DWORD pid = 0;std::cout << "\n请输入PID: ";std::cin >> pid;if (pid == 0) {std::cout << "程序退出。\n";break;}// 验证PID是否有效HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);if (hProcess == NULL) {std::cout << "错误: PID " << pid << " 不存在或无法访问。\n";continue;}CloseHandle(hProcess);// 获取进程名std::wstring processName = GetProcessName(pid);std::wcout << L"进程名: " << processName << L"\n";// 枚举所有窗口std::vector<WindowInfo> windows;EnumWindows(EnumWindowsProc, reinterpret_cast<LPARAM>(&windows));// 查找指定PID的窗口std::vector<WindowInfo> targetWindows;for (const auto& window : windows) {if (window.pid == pid && !window.title.empty()) {targetWindows.push_back(window);}}// 显示结果if (targetWindows.empty()) {std::cout << "该进程没有找到窗口或窗口标题为空。\n";// 检查是否有隐藏窗口std::vector<WindowInfo> hiddenWindows;for (const auto& window : windows) {if (window.pid == pid) {hiddenWindows.push_back(window);}}if (!hiddenWindows.empty()) {std::cout << "但找到 " << hiddenWindows.size() << " 个隐藏/无标题窗口:\n";for (size_t i = 0; i < hiddenWindows.size(); ++i) {const auto& win = hiddenWindows[i];std::wcout << L"  " << (i + 1) << L". 窗口句柄: 0x" << std::hex << win.hwnd << std::dec << L"\n";std::wcout << L"     类名: " << win.className << L"\n";std::wcout << L"     可见: " << (win.isVisible ? L"" : L"") << L"\n";std::wcout << L"     启用: " << (win.isEnabled ? L"" : L"") << L"\n";}}} else {std::cout << "找到 " << targetWindows.size() << " 个窗口:\n";std::cout << std::string(50, '-') << "\n";for (size_t i = 0; i < targetWindows.size(); ++i) {const auto& win = targetWindows[i];std::cout << "窗口 " << (i + 1) << ":\n";std::wcout << L"  标题: " << win.title << L"\n";std::cout << "  句柄: 0x" << std::hex << win.hwnd << std::dec << "\n";std::wcout << L"  类名: " << win.className << L"\n";std::wcout << L"  状态: " << (win.isVisible ? L"可见" : L"隐藏") << L", " << (win.isEnabled ? L"启用" : L"禁用") << L"\n";std::cout << "\n";}}// 可选:列出所有可见窗口供参考char choice;std::cout << "是否列出所有可见窗口?(y/n): ";std::cin >> choice;if (choice == 'y' || choice == 'Y') {std::cout << "\n所有可见窗口列表:\n";std::cout << std::left << std::setw(8) << "PID"<< std::setw(30) << "标题"<< "句柄\n";std::cout << std::string(70, '-') << "\n";for (const auto& window : windows) {if (window.isVisible && !window.title.empty()) {std::wcout << std::left << std::setw(8) << window.pid<< std::setw(30) << window.title.substr(0, 28)<< L"0x" << std::hex << window.hwnd << std::dec << L"\n";}}}}return 0;
}

g++ getWindowTitleFromPid.cpp -o GetWindowTitleByPID.exe -luser32 -lpsapi

http://www.zskr.cn/news/76612.html

相关文章:

  • 半月分期客服妙招帮你脱困省油大空间低配拆解银河A7的“水桶车细节值得吵一架
  • 2025年中国矿用采煤机截齿头公司排名:旋挖钻机截齿头、矿山
  • 2025抗老面霜“红榜”发布:国货成分黑马逆袭,敏感肌也有专属推荐
  • 2025年网站建设公司TOP10综合排名:商业洞察、数字体验与持续运维3大战略评测选择指南
  • 深度学习在神经影像中的应用
  • 冬季抗老精华怎么选?冬季必入的这款次抛精华,实测数据太惊艳!
  • 2025年高阳毛巾厂家权威推荐榜单:竹纤维浴巾‌/高阳浴巾‌/儿童浴巾‌‌源头厂家精选
  • 2025.10.5
  • 2025年评价高的铝艺围栏/铝艺屏风厂家最新推荐排行榜
  • Avalonia Dialog展示在父组件中间位置
  • 私人恒温恒湿雪茄房与会所酒窖设计全解析
  • 迎湖办公室装修:满足个性化需求,靠谱又高性价比
  • Detectron2库 - 教程
  • 河北唐山迁西县农村自建房口碑推荐排行榜。2026年迁西县自建房公司权威测评优选。
  • 永清县自建房找谁好?河北廊坊永清县自建房公司 / 机构深度评测口碑推荐榜​
  • 2025年评价高的6082铝板厂家推荐及选择指南
  • 2026年河北石家庄无极县农村自建房推荐榜,图南建房宝领衔 六家实力公司赋能乡村宜居生活
  • 2025年管母线厂家权威推荐榜单:绝缘管型母线/全屏蔽绝缘铜管母线/管母线源头厂家精选
  • 2025年知名的7075铝材/铝棒铝材厂家推荐及采购参考
  • 批量处理多个excel文件去公式的方法
  • 2025年质量好的苏州喷砂机TOP实力厂家推荐榜
  • 饶阳县农村自建房找谁好?河北衡水饶阳自建房公司/机构深度评测口碑推荐榜
  • Solon AI 开发学习18 - generate - 生成示例参考
  • 纳秒绿光vs红外皮秒,哪款激光器更适合玻璃切割打孔?-外协加工-委外加工-专注于河南郑州激光微纳代加工-激光切割雕刻打孔打标镭雕焊接划线表面处理-芯晨微纳(河南)光电科技有限公司
  • 2025年比较好的钢铁冲压皮膜剂/皮膜剂厂家推荐及选择指南
  • 十大经典排序算法
  • 2025年靠谱的智能电动蛇形帘厂家推荐及选购榜
  • 面试官问MyBatis/OpenFeign的原理?我手搓了个MyHttp怼回去!(反八股版)
  • 2025年质量好的液压五金铰链/3D五金铰链厂家最新TOP实力排行
  • 2025年比较好的煎炒不粘锅最新TOP厂家排名