【问题标题】:Get list of all processes windows name获取所有进程窗口名称的列表
【发布时间】:2021-01-13 16:03:54
【问题描述】:

我目前正在使用以下代码来获取每个正在运行的进程的 processID。

WTS_PROCESS_INFO* pWPIs = NULL;
DWORD dwProcCount = 0;
if(WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, NULL, 1, &pWPIs, &dwProcCount))
{
    //Go through all processes retrieved
    for(DWORD i = 0; i < dwProcCount; i++)
    {
        //pWPIs[i].pProcessName = process file name only, no path!
        //pWPIs[i].ProcessId = process ID
        //pWPIs[i].SessionId = session ID, if you need to limit it to the logged in user processes
        //pWPIs[i].pUserSid = user SID that started the process
    }
}

//Free memory
if(pWPIs)
{
    WTSFreeMemory(pWPIs);
    pWPIs = NULL;
}

我还想获得每个进程的窗口标题(如果它们有的话)。我只对当前会话中的进程感兴趣,因此我将根据会话 ID 过滤掉所有进程。如果他们是我的会话,那么我想获得窗口标题。

例如,如果我在打开 10 个记事本的情况下运行此代码,我会看到

notepad.exe
notepad.exe
notepad.exe
notepad.exe
notepad.exe
notepad.exe
...

但我想获取标题,以便知道哪个记事本打开了哪个文件。

【问题讨论】:

标签: c++ c windows


【解决方案1】:

1) HWND

2) 任务列表(调用系统命令并获取输出)

  1. 您可以找到窗口的 HWND(一个进程可能有很多窗口),然后找到 GetWindowText(hwnd)。

类似:Get hwnd by process id c++

HWND g_HWND=NULL;
BOOL CALLBACK EnumWindowsProcMy(HWND hwnd,LPARAM lParam)
{
    DWORD lpdwProcessId;
    GetWindowThreadProcessId(hwnd,&lpdwProcessId);
    if(lpdwProcessId==lParam)
    {
        g_HWND=hwnd;
        return FALSE;
    }
    return TRUE;
}
EnumWindows(EnumWindowsProcMy,m_ProcessId);

那么你必须调用:

 GetWindowText(g_hwnd, title, nMax);



 int GetWindowTextA(
 HWND  hWnd,
 LPSTR lpString,
 int   nMaxCount
);

https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowtexta

2) 任务列表

使用 WINDOWTITLE 参数和通配符 *(或需要的)

How to get the window title of running application with command-line?

【讨论】:

    猜你喜欢
    • 2013-05-09
    • 1970-01-01
    • 2020-04-03
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多