Click here to Skip to main content
Click here to Skip to main content

Finding module name from the window handle

By , 17 Jul 2006
 

Introduction

A few days back, in one of my projects, I needed to enumerate all the visible windows, and then needed to determine if a given application was running or not. I first struggled a little, but soon found a simple method to do that.

Enumerating the windows

With the EnumWindows API, I filtered out the visible windows. Next, with GetWindowThreadProcessId, I found the process ID of that window, and with that, I found the name of the executable file.

Below is the callback function for EnumWindows:

BOOL CALLBACK CProcessDlg::EnumWindowsProc (HWND hWnd, LPARAM lParam)
{
    CProcessDlg *pDlg = (CProcessDlg *)lParam;

    int nItem = 0;

    //Make sure that the window is visible
    TCHAR szWindowText [MAX_PATH];
    if (!::IsWindowVisible (hWnd))
        return TRUE;

    //Get the text on the title bar
    ::GetWindowText (hWnd, szWindowText, MAX_PATH);

    //If the window is Process Manager then don't display it
    if (_tcsstr (_T("Program Manager"), szWindowText))
        return TRUE;

    //Get process ID
    DWORD dwProcessID;
    GetWindowThreadProcessId (hWnd, &dwProcessID);
    
    //Get the name of the executable file
    CString strEXEName = pDlg->GetEXEName (dwProcessID);

    //Add the info to the list control
    nItem = pDlg->m_List.InsertItem (0, szWindowText);
    pDlg->m_List.SetItemText (nItem, 1, strEXEName);    

    return TRUE;
}

Finding module name

The GetEXEName procedure returns the name of the executable file from its process ID:

#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;
}

Conclusion

The code is very easy to understand and follow, please see the demo project if you have any trouble using it.

I hope you find it useful.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Hitesh Sharma
United States United States
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
QuestionCompiling problemmemberInkasator11 Sep '07 - 1:35 
GeneralAnother way to get the enum the running processes and get their module namemembervertex_x15 Jan '07 - 23:47 
GeneralRe: Another way to get the enum the running processes and get their module namemembervertex_x15 Jan '07 - 23:48 
GeneralRe: Another way to get the enum the running processes and get their module namememberhitesh_sharma16 Jan '07 - 1:23 
Thanks! Thats really nice Smile | :) .
GeneralRe: Another way to get the enum the running processes and get their module namememberOmar.Pessoa19 Jun '08 - 6:35 
Generalbugmembertwinssen6 Jan '07 - 1:05 
QuestionProblem?memberkiranin3 Dec '06 - 7:48 
AnswerRe: Problem?memberhitesh_sharma3 Dec '06 - 22:45 
GeneralRe: Problem?memberkiranin3 Dec '06 - 23:12 
GeneralRe: Problem?memberhitesh_sharma4 Dec '06 - 2:10 
GeneralRe: Problem?memberkiranin4 Dec '06 - 5:55 
QuestionCan we get the URLS?memberkiranin3 Dec '06 - 7:16 
GeneralA simpler waymemberDo Trung Hieu25 Jul '06 - 15:32 
GeneralRe: A simpler waymemberhitesh_sharma26 Jul '06 - 5:59 
GeneralRelated pagememberJJimenezShaw24 Jul '06 - 21:50 
GeneralWay to use the Above MFC in c#.NETmemberajai808518 Jul '06 - 1:46 
GeneralRe: Alternate way to get module namememberhitesh_sharma18 Jul '06 - 2:42 
GeneralRe: Alternate way to get module namememberajai808518 Jul '06 - 3:13 
GeneralRe: Alternate way to get module namememberhitesh_sharma18 Jul '06 - 4:25 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web01 | 2.6.130523.1 | Last Updated 17 Jul 2006
Article Copyright 2006 by Hitesh Sharma
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid