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?
Well, if you're certain that a Windows Explorer window is currently the foreground window you can use GetForegroundWindow. Otherwise, I think you'd have to enumerate through all windows until you've found the top-most Explorer window. Here's an example that I wrote up of how to enumerate through all windows*. Then, according to this SO thread, you can use GetWindowThreadProcessId to filter windows owned by Explorer.
*It's been a while, but I think EnumWindows iterates from the top of the z-order to the bottom.
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.
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()).