How do I GetModuleFileName() if I only have a window handle (hWnd)?

前端 未结 5 2063
误落风尘
误落风尘 2020-12-15 11:11

I\'m trying to get the name of the executable of a window that is outside my C# 2.0 application. My app currently gets a window handle (hWnd) using the GetForegroundWindow()

相关标签:
5条回答
  • 2020-12-15 11:37

    What exactly is it that you're trying to do? You can get the process ID of the the process which created a window with GetWindowThreadProcessId(), followed by OpenProcess() to get the process handle. But this seems very kludgy, and I feel like there's a more elegant way to do what you want to do.

    0 讨论(0)
  • 2020-12-15 11:49

    If you are running on a windows 64 bit platform, you may need to use QueryFullProcessImageName instead. This returns a user style path, compared to GetProcessImageFileName which returns a system style path that would need to be converted using NtQuerySymbolicLinkObject or ZwQuerySymbolicLinkObject.

    One mammoth example function - recommend breaking up into re usable bits.

    typedef DWORD (__stdcall *PfnQueryFullProcessImageName)(HANDLE hProcess, DWORD dwFlags, LPTSTR lpImageFileName, PDWORD nSize);
    typedef DWORD (__stdcall *PfnGetModuleFileNameEx)(HANDLE hProcess, HMODULE hModule, LPTSTR lpImageFileName, DWORD nSize);
    
    std::wstring GetExeName( HWND hWnd ){
    // Convert from Window to Process ID
    DWORD dwProcessID = 0;
    ::GetWindowThreadProcessId(hWnd, &dwProcessID);
    
    // Get a handle to the process from the Process ID
    HANDLE hProcess = ::OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessID);
    
    // Get the process name
    if (NULL != hProcess) {
        TCHAR szEXEName[MAX_PATH*2] = {L'\0'};
        DWORD nExeName = sizeof(szEXEName)/sizeof(TCHAR);
    
        //  the QueryFullProcessImageNameW does not exist on W2K
        HINSTANCE hKernal32dll = LoadLibrary(L"kernel32.dll");
        PfnQueryFullProcessImageName pfnQueryFullProcessImageName = NULL;
        if(hKernal32dll != NULL) {
            pfnQueryFullProcessImageName = (PfnQueryFullProcessImageName)GetProcAddress(hKernal32dll, "QueryFullProcessImageNameW");
            if (pfnQueryFullProcessImageName != NULL) 
                pfnQueryFullProcessImageName(hProcess, 0, szEXEName, &nExeName);
            ::FreeLibrary(hKernal32dll);
        } 
    
        // The following was not working from 32 querying of 64 bit processes
        // Use as backup for when function above is not available 
        if( pfnQueryFullProcessImageName == NULL ){ 
            HINSTANCE hPsapidll = LoadLibrary(L"Psapi.dll");
            PfnGetModuleFileNameEx pfnGetModuleFileNameEx = (PfnGetModuleFileNameEx)GetProcAddress(hPsapidll, "GetModuleFileNameExW");
            if( pfnGetModuleFileNameEx != NULL )    
                pfnGetModuleFileNameEx(hProcess, NULL, szEXEName, sizeof(szEXEName)/sizeof(TCHAR));
            ::FreeLibrary(hPsapidll);
        }
    
        ::CloseHandle(hProcess);
    
        return( szEXEName );
    } 
    return std::wstring();
    }
    
    0 讨论(0)
  • 2020-12-15 11:55

    Been struggling with the same problem for an hour now, also got the first letter replaced by a ? by using GetModuleFileNameEx. Finaly came up with this solution using the System.Diagnostics.Process class.

    [DllImport("user32.dll")]
    public static extern IntPtr GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);
    
    void GetProcessPathFromWindowHandle(IntPtr hwnd)
    {
       uint pid = 0;
       Win32.GetWindowThreadProcessId(hwnd, out pid);
       Process p = Process.GetProcessById((int)pid);
       return p.MainModule.FileName;
    }
    
    0 讨论(0)
  • 2020-12-15 12:00

    You can call GetWindowThreadProcessId and that will return you the process associated with the window.

    From that, you can call OpenProcess to open the process and get the handle to the process.

    0 讨论(0)
  • 2020-12-15 12:04

    try this to get the file name of the executable :

    C#:

    string file = System.Windows.Forms.Application.ExecutablePath;
    

    mfg

    0 讨论(0)
提交回复
热议问题