Search code examples
cwinapiwindows-explorer

How to get HWND of the currently active Windows Explorer window?


I know how to get the HWND of the desktop: GetDesktopWindow().

But I haven't been able to find a function that returns the HWND of the currently active Windows Explorer main window.

How do I get the HWND of the currently active Windows Explorer window in a safe and reliable manner?


Solution

  • You can get the currently active window via GetForegroundWindow(). You could then do GetWindowThreadProcessId() to get a PID which you can then convert to a process handle with OpenProcess() (you will want PROCESS_QUERY_INFORMATION and PROCESS_VM_READ access rights) and then you can check the process name with GetModuleFileNameEx(). Don't remember to close the process handle afterwards with CloseHandle().

    Here's some code I just wrote in notepad. You'd probably do something along these lines.

    DWORD  lpFileName[MAX_PATH] = {0};
    DWORD  dwPID;
    HANDLE hProcess;
    HWND   hwnd = GetForegroundWindow();
    GetWindowThreadProcessId( hwnd, &dwPID );
    hProcess = OpenProcess( PROCESS_QUERY_INFOMRATION | PROCESS_VM_READ, false, dwPID );
    GetModuleFileNameEx( hProcess, NULL, lpFileName, _countof( lpFileName ) );
    PathStripPath( lpFileName );
    
    if( _tcscmp( _T("explorer.exe"), lpFileName ) == 0 ) {
      _tprintf( _T("explorer window found") );
    } else {
      _tprintf( _T("foreground window was not explorer window") );
    }
    CloseHandle( hProcess );
    

    To get all open explorer windows you can use EnumWindows() which you provide a callback which receives all the top-level windows. You can then filter out however you want, maybe by process name (above), maybe by class name (GetClassName()).