1

Visual C++ で、現在のウィンドウのタイトルを取得しています

::GetWindowText(wnd, str, 290);

strcpy(curr_wnd_txt, str); 

しかし、アプリケーションのプロセス名を取得するにはどうすればよいですか? たとえば、Internet Explorer を使用する場合は「Iexplore」、タイルのあるウィンドウの場合は「Skype」、Windows エクスプローラーを使用する場合は「Explorer」です。

これは私が試したものです:

void CMainWndDlg::Monitor_ActiveWindowCaptions()
{
    HWND hwnd;
    DWORD process_id=0;
    GetWindowThreadProcessId(hwnd, &process_id);
    CString strEXEName = GetEXEName (process_id);
}

CString GetEXEName(DWORD dwProcessID)
{
DWORD aProcesses [1024], cbNeeded, cProcesses;
unsigned int i;

if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded))
    return "";

cProcesses = cbNeeded / sizeof(DWORD);

TCHAR szEXEName[MAX_PATH];
for (i = 0; i < cProcesses; i++)
{
    if (aProcesses [i] == dwProcessID)
    {
        HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
                          PROCESS_VM_READ, FALSE, dwProcessID);
        if (NULL != hProcess)
        {
            HMODULE hMod;
            DWORD cbNeeded;
            if(EnumProcessModules(hProcess, &hMod, 
                                  sizeof(hMod), &cbNeeded))
            {
                GetModuleBaseName(hProcess, hMod, szEXEName, 
                    sizeof(szEXEName)/sizeof(TCHAR));
                return CString (szEXEName);
            }
        }
    }    
}
return "";
}
4

2 に答える 2

1

GetModuleFileName() を使用して、現在のプロセスの実行可能ファイルのパスを取得できます。

http://msdn.microsoft.com/en-gb/library/windows/desktop/ms683197(v=vs.85).aspx

于 2013-02-06T10:51:23.390 に答える
0

ウィンドウを列挙し、プロセス ハンドルを取得してから、以下の関数から実行可能ファイルの名前を取得する必要があります。

#include "psapi.h"
#pragma comment(lib, "psapi.lib")

CString GetEXEName(DWORD dwProcessID)
{
    DWORD aProcesses [1024], cbNeeded, cProcesses;
    unsigned int i;

    //Enumerate all processes
    if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded))
        return NULL;

    // Calculate how many process identifiers were returned.
    cProcesses = cbNeeded / sizeof(DWORD);

    TCHAR szEXEName[MAX_PATH];
    //Loop through all process to find the one that matches
    //the one we are looking for
    for (i = 0; i < cProcesses; i++)
    {
        if (aProcesses [i] == dwProcessID)
        {
            // Get a handle to the process
            HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
                              PROCESS_VM_READ, FALSE, dwProcessID);

            // Get the process name
            if (NULL != hProcess)
            {
                HMODULE hMod;
                DWORD cbNeeded;

                if(EnumProcessModules(hProcess, &hMod, 
                                      sizeof(hMod), &cbNeeded))
                {
                    //Get the name of the exe file
                    GetModuleBaseName(hProcess, hMod, szEXEName, 
                        sizeof(szEXEName)/sizeof(TCHAR));

                    return CString (szEXEName);
                }
            }
        }    
    }

    return NULL;
}

ここを参照してください: http://www.codeproject.com/Articles/14843/Finding-module-name-from-the-window-handle

于 2013-02-06T10:52:05.747 に答える