Как получить HWND из текущего активного окна Windows Explorer? - PullRequest
1 голос
/ 10 июня 2011

Я знаю, как получить HWND рабочего стола: GetDesktopWindow () .

Но мне не удалось найти функцию, которая возвращает HWND текущего активного Windows Explorer главного окна.

Как безопасно и надежно получить HWND текущего активного окна Windows Explorer?

Ответы [ 2 ]

7 голосов
/ 10 июня 2011

Вы можете получить текущее активное окно через GetForegroundWindow () . Затем вы можете сделать GetWindowThreadProcessId () , чтобы получить PID, который затем можно преобразовать в дескриптор процесса с помощью OpenProcess () (вам потребуются права доступа PROCESS_QUERY_INFORMATION и PROCESS_VM_READ), а затем вы можете проверьте имя процесса с помощью GetModuleFileNameEx () . Не забудьте потом закрыть дескриптор процесса с помощью CloseHandle () .

Вот код, который я только что написал в блокноте. Вы, вероятно, сделали бы что-то подобное.

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 );

Чтобы получить все открытые окна проводника, вы можете использовать EnumWindows () , для которого вы предоставляете обратный вызов, который получает все окна верхнего уровня. Затем вы можете отфильтровать все, что захотите, возможно, по имени процесса (см. Выше), может быть по имени класса ( GetClassName () ).

2 голосов
/ 10 июня 2011

Что ж, если вы уверены, что окно проводника Windows в настоящее время является окном переднего плана, вы можете использовать GetForegroundWindow . В противном случае, я думаю, вам придется перечислять все окна, пока вы не найдете самое верхнее окно Explorer. Вот пример , который я написал, как перечислять через все окна *. Затем, в соответствии с этим SO потоком , вы можете использовать GetWindowThreadProcessId для фильтрации окон, принадлежащих Проводнику.

* Прошло много времени, но я думаю, EnumWindows выполняет итерации от вершины z-порядка до низа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...