Столкнулся с проблемой. Есть прога. В ней сперва создается из ресурсов диалоговое окно. Потом при нажатии определенной кнопки создаю окно (стиль WS_OVERLAPPEDWINDOW). Нужно чтобы было модальным. Как сделать? Через DialogBox неохота.
hWndParent в CreateWindowEx не помогает чтоли? только кода дофига, через диалоговый шаблон всяко проще
используй EnableWindow для главного окна приблизительно так Код (Text): invoke EnableWindow, hMain,0 INVOKE CreateWindowEx,WS_EX_TOOLWINDOW or WS_EX_TOPMOST,ADDR ClassNameAbout,NULL,\ WS_POPUP,CW_USEDEFAULT,\ CW_USEDEFAULT,260,180,hMain,NULL,\ hInst,NULL mov hwnd,eax invoke ShowWindow, hwnd,SW_SHOWNORMAL invoke UpdateWindow, hwnd .WHILE TRUE invoke GetMessage, ADDR msg, NULL,0,0 .BREAK .IF (!eax) invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg .ENDW invoke EnableWindow, hMain,1
ну не совсем все так как через DialogBoxParam, например главное окно после invoke EnableWindow, hMain,1 проваливается вниз, это тоже надо бы пофиксить, думаю здесь решений может быть несколько
Код (Text): #define NEW_MAX_THREAD_SWITCHES 1000 #ifdef SPI_GETFOREGROUNDLOCKTIMEOUT #define _BRINGWINDOW_SPI_GETFOREGROUNDLOCKTIMEOUT SPI_GETFOREGROUNDLOCKTIMEOUT #else #define _BRINGWINDOW_SPI_GETFOREGROUNDLOCKTIMEOUT 0x2000 #endif #ifdef SPI_SETFOREGROUNDLOCKTIMEOUT #define _BRINGWINDOW_SPI_SETFOREGROUNDLOCKTIMEOUT SPI_SETFOREGROUNDLOCKTIMEOUT #else #define _BRINGWINDOW_SPI_SETFOREGROUNDLOCKTIMEOUT 0x2001 #endif BOOL NewBringWindowToFront(HWND hWnd) { DWORD dwTimeout= 0; HWND hWindow= NULL; DWORD dwTheadID; DWORD dwCurrentTheadID; HWND hCurWnd; unsigned int i; // Add a critical section, if needed hWindow= hWnd; if(hWindow) if(!IsWindow(hWindow)) hWindow= NULL; if(hWindow) if((GetWindowLong(hWindow, GWL_STYLE) & WS_CHILD) && (GetParent(hWindow))) hWindow= NULL; if(hWindow) if(!SystemParametersInfo(_BRINGWINDOW_GETFOREGROUNDLOCKTIMEOUT, 0, &dwTimeout, 0)) dwTimeout= 0; dwTheadID= GetCurrentThreadId(); for(i= 0; hCurWnd= GetForegroundWindow(), (hWindow?hCurWnd!=hWindow:true); i++) { dwCurrentTheadID= GetWindowThreadProcessId(hCurWnd, 0); if(dwCurrentTheadID==dwTheadID && !hWindow) break; AttachThreadInput(dwTheadID, dwCurrentTheadID, TRUE); if(hWindow) SetForegroundWindow(hWindow); AttachThreadInput(dwTheadID, dwCurrentTheadID, FALSE); SwitchToThread(); // Sleep(20); if(i>NEW_MAX_THREAD_SWITCHES) break; } if(hWindow) { if(dwTimeout) if(!SystemParametersInfo(_BRINGWINDOW_SETFOREGROUNDLOCKTIMEOUT, 0, 0, 0)) dwTimeout= 0; SetWindowPos(hWindow, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); if(dwTimeout) SystemParametersInfo(_BRINGWINDOW_SETFOREGROUNDLOCKTIMEOUT, 0, &dwTimeout, 0); } return i>NEW_MAX_THREAD_SWITCHES?FALSE:TRUE; }
Astrix Да после выхода родительское сворачивается. Я просто после EnableWindow hParent, TRUE добавил SetFocus hParent