Как вернуть фокус назад, когда SHBrowseForFolder возвращается

51
5

В настоящее время я использую SHBrowseForFolder() чтобы открыть окно папки просмотра, но как вернуть фокус в основное окно при нажатии Cancel/OK. Я прочитал, что я должен снова включить мое главное окно, прежде чем диалог закроется, но где это точно? Есть предположения?

void buttonPush(HWND hWnd) {
EnableWindow(hWnd, FALSE);
BROWSEINFO bi = { 0 };
TCHAR szDir[MAX_PATH] = { 0 };
LPITEMIDLIST pid = NULL;
LPMALLOC pMalloc = NULL;

if (SUCCEEDED(SHGetMalloc(&pMalloc)))
{
ZeroMemory(&bi,sizeof(bi));
bi.hwndOwner = NULL;
bi.pszDisplayName = NULL;
bi.pidlRoot = NULL;
bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT | BIF_USENEWUI;
bi.lpfn = BrowseCallbackProc;

pidl = SHBrowseForFolder(&bi);
if (pidl)
{
// Folder selected in dialog
pMalloc->Free(pidl);
}
pMalloc->Release();
}
EnableWindow(hWnd, TRUE);
}

спросил(а) 2013-01-05T20:23:00+04:00 7 лет, 3 месяца назад
1
Решение
97

Вместо включения и отключения основного окна просто установите bi.hwndOwner = hWnd; Затем он автоматически включится и отключится.

ответил(а) 2013-01-05T20:43:00+04:00 7 лет, 3 месяца назад
83

  EnableWindow(hWnd, false);

Это не так, потому что вы слишком много помогаете. Когда диалог закрывается, в вашем приложении нет окна, которое все равно может получить фокус. Ваш hWnd по-прежнему отключен, он не включается до более позднего времени. Таким образом, оконный менеджер Windows вынужден найти другое окно для фокусировки. Это будет окно другого приложения. Неизбежно ваше окно исчезнет за ним.

Удалите вызовы EnableWindow(). Этого достаточно, но вы можете рассказать диалог о своем окне, чтобы он не мог угадать, полезно, если ваше окно не является активным окном по какой-то причине:

  bi.hwndOwner = hWnd;

ответил(а) 2013-01-05T20:51:00+04:00 7 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема