Also, I don’t know if it helps but these are the Windows messages my app receives during the dialog creation/closing process, along with some of the SDL calls that handle it (with stock v1.2.13 code). Note especially the WinMessage WM_ACTIVATE re-entry, caused by the ShowWindow call in RestoreDesktopMode to minimize the app.
Ah… This is probably the issue. The first WM_ACTIVATE has the proper dialog hwnd in its lParam, but the ShowWindow(SDL_Window, SW_MINIMIZE) call to minimize the app causes another WM_ACTIVATE with a NULL hwnd lParam.
I still don’t know why the dialog’s focus would be lost if the app isn’t minimized, though. I’ve only seen that behavior on Vista, not XP, so it’s not as easy for me to test.
App hwnd = 0x580112
Dialog hwnd = 0x6600F6
Code:
Start App:
WM_GETMINMAXINFO – 0x0, 0x12D790
WM_NCCREATE – 0x0, 0x12D778
WM_NCCALCSIZE – 0x0, 0x12D7B0
WM_CREATE – 0x0, 0x12D764
WM_SETTEXT – 0x0, 0x12DF70
WM_DISPLAYCHANGE – 0x20, 0x3000400
WM_STYLECHANGING – 0xFFFFFFF0, 0x12DEE4
WM_STYLECHANGED – 0xFFFFFFF0, 0x12DEE4
WM_WINDOWPOSCHANGING – 0x0, 0x12DEFC
WM_NCCALCSIZE – 0x1, 0x12DED0
WM_WINDOWPOSCHANGING – 0x0, 0x12DEFC
WM_NCPAINT – 0x1, 0x0
WM_ERASEBKGND – 0xDF0105DC, 0x0
WM_WINDOWPOSCHANGED – 0x0, 0x12DEFC
WM_ACTIVATEAPP – 0x1, 0x34C
WM_NCACTIVATE – 0x1, 0x0
WM_ACTIVATE – 0x1, 0x0
WM_IME_SETCONTEXT – 0x1, 0xC000000F
WM_IME_NOTIFY – 0x2, 0x0
WM_SETFOCUS – 0x0, 0x0
WM_WINDOWPOSCHANGED – 0x0, 0x12DEFC
WM_MOVE – 0x0, 0x0
WM_SIZE – 0x0, 0x3000400
WM_NCCREATE – 0x0, 0x12D74C, 0x290264
WM_NCCALCSIZE – 0x0, 0x12D784, 0x290264
WM_CREATE – 0x0, 0x12D738, 0x290264
WM_SIZE – 0x0, 0xA000A, 0x290264
WM_MOVE – 0x0, 0x0, 0x290264
WM_GETICON – 0x2, 0x0
WM_GETICON – 0x0, 0x0
WM_GETICON – 0x1, 0x0
WM_NCHITTEST – 0x0, 0x1800200
WM_SETCURSOR – 0x580112, 0x2000001
WM_MOUSEMOVE – 0x0, 0x1800200
WM_PAINT – 0x0, 0x0
WM_DESTROY – 0x0, 0x0, 0x290264
WM_NCDESTROY – 0x0, 0x0, 0x290264
WM_NCHITTEST – 0x0, 0x1800200
WM_SETCURSOR – 0x580112, 0x2000001
WM_MOUSEMOVE – 0x0, 0x1800200
WM_NCHITTEST – 0x0, 0x1800200
WM_SETTEXT – 0x0, 0x12EC8C
WM_GETICON – 0x2, 0x0
WM_GETICON – 0x0, 0x0
WM_GETICON – 0x1, 0x0
…
Click Open File button
WM_LBUTTONDOWN – 0x1, 0x18001F9
WM_LBUTTONUP – 0x0, 0x18001F9
WM_CAPTURECHANGED – 0x0, 0x0
WM_NCHITTEST – 0x0, 0x18001F9
WM_NCHITTEST – 0x0, 0x18001F9
WM_SETCURSOR – 0x580112, 0x2000001
WM_MOUSEMOVE – 0x0, 0x18001F9
GetOpenFileName() called
WM_CANCELMODE – 0x0, 0x0
WM_KILLFOCUS – 0x0, 0x0
WM_IME_SETCONTEXT – 0x0, 0xC000000F
WM_IME_NOTIFY – 0x1, 0x0
WM_ENABLE – 0x0, 0x0
WM_NCACTIVATE – 0x0, 0x6600F6
WM_ACTIVATE – 0x0, 0x6600F6
RestoreDesktopMode()
ShowWindow(SDL_Window, SW_MINIMIZE)
(WinMessage re-entry)
WM_GETTEXT – 0x1FE, 0x12BDC8
(window minimizing animation, though desktop hasn’t repainted yet)
WM_WINDOWPOSCHANGING – 0x0, 0x12CFDC
WM_NCCALCSIZE – 0x1, 0x12CFB0
(desktop repaints)
WM_NCPAINT – 0x1, 0x0
WM_WINDOWPOSCHANGED – 0x0, 0x12CFDC
WM_MOVE – 0x0, 0x83008300
WM_SIZE – 0x1, 0x0
WM_NCACTIVATE – 0x0, 0x0
WM_GETTEXT – 0x1FE, 0x12B8D4
WM_ACTIVATE – 0x200000, 0x0
RestoreDesktopMode()
ShowWindow(SDL_Window, SW_MINIMIZE)
ChangeDisplaySettings()
(screen flash)
WM_DISPLAYCHANGE – 0x20, 0x4000500
SDL_PrivateAppActive()/SDL_ProcessEvents()
WM_ACTIVATEAPP – 0x0, 0x34C
(return from ShowWindow/re-entry)
ChangeDisplaySettings()
SDL_PrivateAppActive() state-no-change short-circuit
WM_WINDOWPOSCHANGING – 0x0, 0x12D304
WM_WINDOWPOSCHANGED – 0x0, 0x12D304
WM_ACTIVATEAPP – 0x1, 0x0
WM_MOUSELEAVE – 0x0, 0x0
…WM_ENTERIDLE – 0x0, 0x6600F6…
Select file and ‘Open’, or ‘Cancel’
WM_ENABLE – 0x1, 0x0
WM_WINDOWPOSCHANGING – 0x0, 0x12D300
WM_WINDOWPOSCHANGED – 0x0, 0x12D300
WM_NCACTIVATE – 0x200001, 0x6600F6
WM_GETTEXT – 0x1FE, 0x12BBF8
WM_ACTIVATE – 0x200001, 0x6600F6
(but active is set to 0 because app is minimized)
SDL_PrivateAppActive() state-no-change short-circuit
Click on taskbar icon to restore app
WM_NCACTIVATE – 0x1, 0x0
WM_GETTEXT – 0x1FE, 0x12E050
WM_WINDOWPOSCHANGING – 0x0, 0x12F758
WM_WINDOWPOSCHANGED – 0x0, 0x12F758
WM_QUERYOPEN – 0x0, 0x0
WM_GETTEXT – 0x1FE, 0x12E544
WM_WINDOWPOSCHANGING – 0x0, 0x12F758
WM_NCCALCSIZE – 0x1, 0x12F72C
WM_NCPAINT – 0x1, 0x0
WM_ERASEBKGND – 0xDF0105DC, 0x0
WM_WINDOWPOSCHANGED – 0x0, 0x12F758
WM_MOVE – 0x0, 0x0
WM_SIZE – 0x0, 0x3000400
WM_IME_SETCONTEXT – 0x1, 0xC000000F
WM_IME_NOTIFY – 0x2, 0x0
WM_SETFOCUS – 0x0, 0x0
WM_ACTIVATE – 0x1, 0x0
SDL_RestoreGameMode()
ShowWindow(SDL_Window, SW_RESTORE)
ChangeDisplaySettings()
WM_DISPLAYCHANGE – 0x20, 0x3000400
WM_SYNCPAINT – 0x4, 0x0
WM_NCPAINT – 0x1, 0x0
WM_ERASEBKGND – 0xDF0105DC, 0x0
…
Quit App:
WM_LBUTTONDOWN – 0x1, 0x2E103B3
WM_LBUTTONUP – 0x0, 0x2E103B3
WM_CAPTURECHANGED – 0x0, 0x0
WM_NCHITTEST – 0x0, 0x2E103B3
WM_NCHITTEST – 0x0, 0x2E103B3
WM_SETCURSOR – 0x580112, 0x2000001
WM_MOUSEMOVE – 0x0, 0x2E103B3
WM_WINDOWPOSCHANGING – 0x0, 0x12F948
WM_DISPLAYCHANGE – 0x20, 0x4000500
WM_SHOWWINDOW – 0x0, 0x0
WM_WINDOWPOSCHANGING – 0x0, 0x12F998
WM_WINDOWPOSCHANGED – 0x0, 0x12F998
WM_SIZE – 0x0, 0x3000400
WM_MOVE – 0x0, 0x0
WM_NCACTIVATE – 0x0, 0x0
WM_ACTIVATE – 0x0, 0x0
SDL_RestoreDesktopMode()
WM_KILLFOCUS – 0x0, 0x0
WM_IME_SETCONTEXT – 0x0, 0xC000000F
WM_IME_NOTIFY – 0x1, 0x0
WM_WINDOWPOSCHANGING – 0x0, 0x12F5C0
WM_NCCALCSIZE – 0x1, 0x12F594
WM_NCPAINT – 0x1, 0x0
WM_WINDOWPOSCHANGED – 0x0, 0x12F5C0
WM_MOVE – 0x0, 0x83008300
WM_SIZE – 0x1, 0x0
ChangeDisplaySettings()
SDL_PrivateAppActive/SDL_ProcessEvents
WM_ACTIVATEAPP – 0x0, 0xDC0
WM_WINDOWPOSCHANGING – 0x0, 0x12F944
WM_WINDOWPOSCHANGED – 0x0, 0x12F944
WM_DESTROY – 0x0, 0x0
WM_NCDESTROY – 0x0, 0x0