Можно ли создать диалог GetOpenFileName в полноэкранном приложении?

У меня есть полноэкранное приложение, написанное на С++, и я хотел бы открыть диалоговое окно, чтобы пользователь мог выбрать файл для открытия без выхода приложения из полноэкранного режима.

В Windows для запуска в полноэкранном режиме я вызываю ChangeDisplaySettings(&settings, CDS_FULLSCREEN). (Технически я использую SDL, но он использует именно этот вызов.)

Чтобы открыть диалоговое окно файла, я использую следующий код:

HWND hWnd = NULL;
SDL_SysWMinfo wmInfo;
SDL_VERSION(&wmInfo.version);
if( SDL_GetWMInfo(&wmInfo) ) {
    hWnd = wmInfo.window; // Note: This is sucessful, and hWnd != NULL
}

OPENFILENAMEW ofn;
wchar_t fileName[MAX_PATH] = L"";
ZeroMemory(&ofn, sizeof(ofn));

ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFile = fileName;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST;

if( GetOpenFileNameW( &ofn ) ) {
    DoSomethingWith( fileName );
}

При запуске hWnd не равно NULL, но когда это диалоговое окно создается, оно смещает фокус окна на диалоговое окно, которое вырывается из полноэкранного приложения, аналогично переходу с помощью Alt-Tab в другое окно в полноэкранном режиме. Как только файл выбран и диалоговое окно «Открыть файл» закрывается, мне приходится вручную переключаться обратно в полноэкранное приложение.

Можно ли делать то, что я хочу, используя существующие диалоги Windows, или мне нужно написать свою собственную систему просмотра файлов в приложении или работать только в оконном режиме?


person JDS    schedule 02.07.2010    source источник


Ответы (1)


Конечно... вам просто нужно передать HWND полноэкранного окна в качестве родителя общего диалогового окна "Открыть файл" (это параметр hwndOwner в структуре OPENFILENAME, который передается GetOpenFileName).

person lornova    schedule 02.07.2010
comment
Я добавил код, который использую для получения и установки hwndOwner, но он по-прежнему не работает, даже если hwndOwner не равен NULL. Возможно, сейчас это больше вопрос SDL. - person JDS; 03.07.2010
comment
Хм, завтра попробую сам (на простом C+WinAPI, т.к. SDL не знаю) и дам знать... - person lornova; 03.07.2010
comment
Я знаю, что это работает в обычном приложении Win32, работающем в полноэкранном режиме. Я понятия не имею о SDL, но я не знаю, что он может делать по-другому. - person casablanca; 03.07.2010