BYTE Krnl_Environment_StartupCmdIsPresent( VOID ) { // Перебираем окна в окне рабочего стола. HENUM Enumeration = WinBeginEnumWindows( QueryDesktopWindow() ); HWND Window = NULLHANDLE; while( ( Window = WinGetNextWindow( Enumeration ) ) != NULLHANDLE ) { // Если это не окно рамки - продолжаем перебор окон. if( !IsFrameWindow( Window ) ) continue; // Если это текстовое окно - проверяем его заголовок. if( IsVIOWindow( Window ) ) { // Узнаем заголовок окна. CHAR Title[ SIZE_OF_TITLE ] = ""; WinQueryWindowText( WinWindowFromID( Window, FID_TITLEBAR ), SIZE_OF_TITLE, Title ); // Если в нем встречается слово "Startup": if( stristr( "Startup", Title ) ) { // Завершаем перебор окон. WinEndEnumWindows( Enumeration ); // Окно присутствует, возврат. return 1; } } } WinEndEnumWindows( Enumeration ); // Возврат. return 0; }
// Frame_window - окно рамки. VOID Diver_CheckWindowControls( HWND Frame_window ) { // Узнаем очередь сообщений окна. HMQ Message_queue = WinQueryWindowULong( Frame_window, QWL_HMQ ); { // Перебираем окна в окне рабочего стола. HENUM Enumeration = WinBeginEnumWindows( QueryDesktopWindow() ); HWND Window = NULLHANDLE; while( ( Window = WinGetNextWindow( Enumeration ) ) != NULLHANDLE ) { // Если окно скрыто - продолжаем перебор окон. if( !WinIsWindowVisible( Window ) ) continue; // Если это не окно рамки - продолжаем перебор окон. if( !IsFrameWindow( Window ) ) continue; // Если это то же самое окно - продолжаем перебор окон. if( Window == Frame_window ) continue; // Узнаем очередь сообщений окна. HMQ Window_queue = WinQueryWindowULong( Window, QWL_HMQ ); // Если окно использует ту же очередь сообщений - его надо проверить. if( Window_queue == Message_queue ) if( PermissionForDrawing( Window ) ) Diver_QueryWindowProperty( Window, WT_SYSMENU | WT_MINMAX, CLOSE_ACTION ); } WinEndEnumWindows( Enumeration ); } // Возврат. return; }
static void internal_SetPageFont(HWND hwnd) { char *pchTemp; // Set new window fonts! if (DosRequestMutexSem(hmtxUseNLSTextArray, SEM_INDEFINITE_WAIT)==NO_ERROR) { pchTemp = apchNLSText[SSMODULE_NLSTEXT_FONTTOUSE]; if (pchTemp) { HWND hwndChild; HENUM henum; // Oookay, we have the font, set the page and all controls inside it! WinSetPresParam(hwnd, PP_FONTNAMESIZE, strlen(pchTemp)+1, pchTemp); // Now go through all of its children, and set it there, too! henum = WinBeginEnumWindows(hwnd); while ((hwndChild = WinGetNextWindow(henum))!=NULLHANDLE) { WinSetPresParam(hwndChild, PP_FONTNAMESIZE, strlen(pchTemp)+1, pchTemp); } WinEndEnumWindows(henum); } DosReleaseMutexSem(hmtxUseNLSTextArray); } }
BYTE Krnl_Environment_ShellIsFileBar( VOID ) { // FileBar может быть вызван после расширителя. if( Krnl_Environment.RTSettings.Shell_is_FileBar ) return 1; { // Перебираем окна в окне рабочего стола. HENUM Enumeration = WinBeginEnumWindows( QueryDesktopWindow() ); HWND Window = NULLHANDLE; while( ( Window = WinGetNextWindow( Enumeration ) ) != NULLHANDLE ) { // Если окно скрыто - продолжаем перебор окон. if( !WinIsWindowVisible( Window ) ) continue; // Если это FileBar - считаем, что он используется в качестве оболочки. if( IsFileBarWindow( Window ) ) { Krnl_Environment.RTSettings.Shell_is_FileBar = 1; break; } } WinEndEnumWindows( Enumeration ); } // Возврат. return Krnl_Environment.RTSettings.Shell_is_FileBar; }
static void broadcast(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) { HWND hwndNext; HENUM henum = WinBeginEnumWindows(hwnd); while ((hwndNext = WinGetNextWindow(henum)) != NULLHANDLE) WinSendMsg(hwndNext,msg,mp1,mp2); WinEndEnumWindows (henum); }
MRESULT EXPENTRY OS2Factory::OS2FrameProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 ) { // Get pointer to thread info: should only work with the parent window intf_thread_t *p_intf = (intf_thread_t *)WinQueryWindowPtr( hwnd, 0 ); OS2Factory *pFactory = (OS2Factory*)OS2Factory::instance( p_intf ); if( msg == WM_ADJUSTWINDOWPOS ) { PSWP pswp = ( PSWP )PVOIDFROMMP( mp1 ); if( pswp->fl & ( SWP_MINIMIZE | SWP_RESTORE )) { // propagate to all the owned windows HENUM henum = WinBeginEnumWindows( HWND_DESKTOP ); HWND hwndNext; while(( hwndNext = WinGetNextWindow( henum )) != NULLHANDLE ) { if( WinQueryWindow( hwndNext, QW_OWNER ) == pFactory->m_hParentClientWindow ) WinSetWindowPos( hwndNext, 0, 0, 0, 0, 0, pswp->fl & ( SWP_MINIMIZE | SWP_RESTORE )); } } } else if( msg == WM_SYSCOMMAND ) { // If closing parent window if( SHORT1FROMMP(mp1) == SC_CLOSE ) { libvlc_Quit( p_intf->p_libvlc ); return 0; } else if( SHORT1FROMMP(mp1) == SC_MINIMIZE ) { pFactory->minimize(); return 0; } else if( SHORT1FROMMP(mp1) == SC_RESTORE ) { pFactory->restore(); return 0; } else { msg_Dbg( p_intf, "WM_SYSCOMMAND %i", (SHORT1FROMMP(mp1))); } } return pFactory->m_pfnwpOldFrameProc( hwnd, msg, mp1, mp2 ); }
/** * Center the dialog. * @param cx New client area size - x. * @param cy New client area size - y. */ VOID kAboutPage::ntfySized(LONG cx, LONG cy) { SWP swp; if (WinQueryWindowPos(hwnd, &swp)) { /* * Center dialog. * This didn't work while all space around the dialog * were white and I haven't figured out how to make it colored. * So we'll do it a different manner. Blow up the dialog and center * all elements. */ #if 0 WinSetWindowPos(hwnd, NULLHANDLE, cx / 2 - swp.cx / 2, cy / 2 - swp.cy / 2, 0, 0, SWP_MOVE); #else HWND hwndCtrl; HENUM henum; WinSetWindowPos(hwnd, NULLHANDLE, 0, 0, cx, cy, SWP_MOVE | SWP_SIZE); henum = WinBeginEnumWindows(hwnd); while ((hwndCtrl = WinGetNextWindow(henum)) != NULLHANDLE) { SWP swpCtrl; if (WinQueryWindowPos(hwndCtrl, &swpCtrl)) WinSetWindowPos(hwndCtrl, NULLHANDLE, cx / 2 - swpCtrl.cx / 2, swpCtrl.y + (cy - swp.cy) / 2, 0, 0, SWP_MOVE); } WinEndEnumWindows(henum); #endif } }
BOOL launchPad::lpClearPad() { LPObject *lpoTemp, *lpoTemp2; int a; HENUM hEnum; HWND hwnd; /* Destroy all Buttons */ hEnum=WinBeginEnumWindows(hwndLaunchPad); while((hwnd=WinGetNextWindow(hEnum))!=NULLHANDLE) WinDestroyWindow(hwnd); WinEndEnumWindows(hEnum); return TRUE; }
/* * Modified by Chris Wohlgemuth 2001 for use with CandyFolder */ BOOL winhAssertWarp4Notebook(HWND hwndDlg, USHORT usIdThreshold, // in: ID threshold ULONG ulDownUnits) // in: dialog units or 0 { BOOL brc = FALSE; POINTL ptl; HAB hab = WinQueryAnchorBlock(hwndDlg); BOOL fIsVisible = WinIsWindowVisible(hwndDlg); if (ulDownUnits) { ptl.x = 0; ptl.y = ulDownUnits; WinMapDlgPoints(hwndDlg, &ptl, 1, TRUE); } WinEnableWindowUpdate(hwndDlg, FALSE); if (cwQueryOSRelease()>=40) { HENUM henum = WinBeginEnumWindows(hwndDlg); HWND hwndItem; while ((hwndItem = WinGetNextWindow(henum))!=NULLHANDLE) { USHORT usId = WinQueryWindowUShort(hwndItem, QWS_ID); if (usId <= usIdThreshold) { // pushbutton to change: WinSetWindowBits(hwndItem, QWL_STYLE, BS_NOTEBOOKBUTTON, BS_NOTEBOOKBUTTON); brc = TRUE; } else // no pushbutton to change: move downwards // if desired if (ulDownUnits) { SWP swp; WinQueryWindowPos(hwndItem, &swp); WinSetWindowPos(hwndItem, 0, swp.x, swp.y - ptl.y, 0, 0, SWP_MOVE); } } WinEndEnumWindows(henum); } if (fIsVisible) WinShowWindow(hwndDlg, TRUE); return (brc); }
/*@ XToolBar::Draw(void) @group display @remarks Redraw the toolbar. */ void XToolBar::Draw(void) { RECTL rect; WinQueryWindowRect(winhandle, &rect); HPS hps = WinGetPS(winhandle); GpiCreateLogColorTable(hps, LCOL_RESET, LCOLF_RGB, 0,0,NULL); WinFillRect( hps, &rect, SYSCLR_BUTTONMIDDLE); WinDrawBorder(hps, &rect, 1,1,0,0,DB_PATCOPY|DB_RAISED); HENUM e; HWND hwnd; e = WinBeginEnumWindows(winhandle); while ((hwnd = WinGetNextWindow(e)) != 0) WinInvalidateRegion(hwnd, NULLHANDLE, TRUE); WinEndEnumWindows(e); }
//--------------------------------------------------------------- void hide_scrollbars( HWND hwnd ) { HENUM henum; HWND hwndNext; CHAR szClass[8]; henum = WinBeginEnumWindows(hwnd); while ((hwndNext = WinGetNextWindow(henum)) != NULLHANDLE) { WinQueryClassName( hwndNext, strlen(szClass), szClass ); if (!strncmp(WC_SCROLLBAR, szClass, strlen(szClass) )) { WinShowWindow( hwndNext, FALSE ); } else hide_scrollbars( hwndNext ); // recursive! } WinEndEnumWindows(henum); }
// Window - окно, Type - какую полоску надо найти, значение "SBS_*". // Target_window_placement - расположение окна, для которого должна быть найдена полоска. // Возвращаемое значение: окно полоски просмотра или NULLHANDLE. HWND Scroller_FindScrollBar( HWND Window, BYTE Type, PSWP Target_window_placement = NULL ) { // Если расположение окна не указано - задаем пустые значения. HWND Desktop = QueryDesktopWindow(); INT X_Screen = WinQuerySysValue( Desktop, SV_CXSCREEN ); INT Y_Screen = WinQuerySysValue( Desktop, SV_CYSCREEN ); SWP Default_placement = { 0, Y_Screen * 2, X_Screen * 2, Y_Screen * (-1), X_Screen * (-1), NULLHANDLE, NULLHANDLE, 0, 0 }; if( Target_window_placement == NULL ) Target_window_placement = &Default_placement; // Изначально окно полоски неизвестно. HWND Scroll_bar = NULLHANDLE; { // Перебираем окна, пока не найдем полоску. HENUM Enumeration = WinBeginEnumWindows( Window ); HWND Current_window = NULLHANDLE; while( ( Current_window = WinGetNextWindow( Enumeration ) ) != NULLHANDLE ) { // Если окно не скрыто: if( WinIsWindowVisible( Current_window ) ) { // Если это полоска просмотра: if( IsScrollBarWindow( Current_window ) ) { // Узнаем, как она расположена. SWP Rectangle = {0}; WinQueryWindowPos( Current_window, &Rectangle ); // Если мы ищем как раз такую полоску - завершаем перебор окон. if( Type == SBS_VERT ) if( Rectangle.cy > Rectangle.cx ) if( Rectangle.y + Rectangle.cy / 2 > Target_window_placement->y ) if( Rectangle.y + Rectangle.cy / 2 < Target_window_placement->y + Target_window_placement->cy ) { Scroll_bar = Current_window; break; } if( Type == SBS_HORZ ) if( Rectangle.cx > Rectangle.cy ) if( Rectangle.x + Rectangle.cx / 2 > Target_window_placement->x ) if( Rectangle.x + Rectangle.cx / 2 < Target_window_placement->x + Target_window_placement->cx ) { Scroll_bar = Current_window; break; } } } } WinEndEnumWindows( Enumeration ); } // Возвращаем указатель на полоску, если она была найдена, или NULLHANDLE. return Scroll_bar; }
// Возвращаемое значение: 1 - WPS, 0 - другая оболочка. BYTE Krnl_Environment_ShellIsWPS( VOID ) { // Перебираем окна в окне рабочего стола. HENUM Enumeration = WinBeginEnumWindows( QueryDesktopWindow() ); HWND Window = NULLHANDLE; while( ( Window = WinGetNextWindow( Enumeration ) ) != NULLHANDLE ) { // Если окно скрыто - продолжаем перебор окон. if( !WinIsWindowVisible( Window ) ) continue; // Если это окно WPS - используется оболочка WPS. if( IsFolderWindow( Window ) ) { // Завершаем перебор окон. WinEndEnumWindows( Enumeration ); // Возврат. return 1; } } WinEndEnumWindows( Enumeration ); // Возврат. return 0; }
MRESULT EXPENTRY DirDialogProc( HWND hwndDlg, ULONG msg, MPARAM mp1, MPARAM mp2) { switch ( msg ) { case WM_INITDLG: { SWP swpFileST; SWP swpDirST; SWP swpDirLB; SWP swpDriveST; SWP swpDriveCB; SWP swpDriveCBEF; SWP swpOK; SWP swpCancel; HWND hwndFileST; HWND hwndDirST; HWND hwndDirLB; HWND hwndDriveST; HWND hwndDriveCB; HWND hwndOK; HWND hwndCancel; HENUM henum; HWND hwndNext; ULONG ulCurY, ulCurX; LONG lScreenX, lScreenY, lDlgFrameX, lDlgFrameY, lTitleBarY; lScreenX = WinQuerySysValue(HWND_DESKTOP, SV_CXSCREEN); lScreenY = WinQuerySysValue(HWND_DESKTOP, SV_CYSCREEN); lDlgFrameX = WinQuerySysValue(HWND_DESKTOP, SV_CXDLGFRAME); lDlgFrameY = WinQuerySysValue(HWND_DESKTOP, SV_CYDLGFRAME); lTitleBarY = WinQuerySysValue(HWND_DESKTOP, SV_CYTITLEBAR); hwndFileST = WinWindowFromID(hwndDlg, DID_FILENAME_TXT); hwndDirST = WinWindowFromID(hwndDlg, DID_DIRECTORY_TXT); hwndDirLB = WinWindowFromID(hwndDlg, DID_DIRECTORY_LB); hwndDriveST = WinWindowFromID(hwndDlg, DID_DRIVE_TXT); hwndDriveCB = WinWindowFromID(hwndDlg, DID_DRIVE_CB); hwndOK = WinWindowFromID(hwndDlg, DID_OK); hwndCancel = WinWindowFromID(hwndDlg, DID_CANCEL); #define SPACING 10 // Reposition drives combobox ulCurY = SPACING; ulCurX = SPACING + lDlgFrameX; WinQueryWindowPos(hwndOK, &swpOK); WinSetWindowPos(hwndOK, 0, ulCurX, ulCurY, 0, 0, SWP_MOVE); ulCurY += swpOK.cy + SPACING; WinQueryWindowPos(hwndCancel, &swpCancel); WinSetWindowPos(hwndCancel, 0, ulCurX+swpOK.cx+10, SPACING, 0, 0, SWP_MOVE); WinQueryWindowPos(hwndDirLB, &swpDirLB); WinSetWindowPos(hwndDirLB, 0, ulCurX, ulCurY, swpDirLB.cx, swpDirLB.cy, SWP_MOVE | SWP_SIZE); ulCurY += swpDirLB.cy + SPACING; WinQueryWindowPos(hwndDirST, &swpDirST); WinSetWindowPos(hwndDirST, 0, ulCurX, ulCurY, swpDirST.cx, swpDirST.cy, SWP_MOVE | SWP_SIZE); ulCurY += swpDirST.cy + SPACING; WinQueryWindowPos(hwndDriveCB, &swpDriveCB); WinQueryWindowPos(WinWindowFromID(hwndDriveCB, CBID_EDIT), &swpDriveCBEF); WinSetWindowPos(hwndDriveCB, 0, ulCurX, ulCurY-(swpDriveCB.cy-swpDriveCBEF.cy)+5, swpDirLB.cx, swpDriveCB.cy, SWP_SIZE | SWP_MOVE); ulCurY += swpDriveCBEF.cy + SPACING; WinQueryWindowPos(hwndDriveST, &swpDriveST); WinSetWindowPos(hwndDriveST, 0, ulCurX, ulCurY, swpDriveST.cx, swpDriveST.cy, SWP_MOVE | SWP_SIZE); ulCurY += swpDriveST.cy + SPACING; WinQueryWindowPos(hwndFileST, &swpFileST); WinSetWindowPos(hwndFileST, 0, ulCurX, ulCurY, swpFileST.cx, swpFileST.cy, SWP_MOVE | SWP_SIZE); ulCurY += swpFileST.cy + SPACING; // Hide unused stuff henum = WinBeginEnumWindows(hwndDlg); while ((hwndNext = WinGetNextWindow(henum)) != NULLHANDLE) { USHORT usID = WinQueryWindowUShort(hwndNext, QWS_ID); if (usID != DID_FILENAME_TXT && usID != DID_DIRECTORY_TXT && usID != DID_DIRECTORY_LB && usID != DID_DRIVE_TXT && usID != DID_DRIVE_CB && usID != DID_OK && usID != DID_CANCEL && usID != FID_TITLEBAR && usID != FID_SYSMENU && usID != FID_MINMAX) { WinShowWindow(hwndNext, FALSE); } } WinSetWindowPos(hwndDlg, HWND_TOP, (lScreenX/2)-((swpDirLB.cx+2*SPACING+2*lDlgFrameX)/2), (lScreenY/2)-((ulCurY+2*lDlgFrameY+lTitleBarY)/2), swpDirLB.cx+2*SPACING+2*lDlgFrameX, ulCurY+2*lDlgFrameY+lTitleBarY, SWP_MOVE | SWP_SIZE); } break; case WM_CONTROL: { PFILEDLG pfiledlg; pfiledlg = (PFILEDLG)WinQueryWindowPtr(hwndDlg, QWL_USER); HPS hps; SWP swp; HWND hwndST; RECTL rectlString = {0,0,1000,1000}; char *ptr = NULL; int iHalfLen; int iLength; CHAR szString[CCHMAXPATH]; hwndST = WinWindowFromID(hwndDlg, DID_FILENAME_TXT); strcpy(szString, pfiledlg->szFullFile); iLength = strlen(pfiledlg->szFullFile); /* If we are not just a drive */ if (iLength > 3) { if (szString[iLength-1] == '\\') { szString[iLength-1] = '\0'; iLength--; } } hps = WinGetPS(hwndST); WinQueryWindowPos(hwndST, &swp); WinDrawText(hps, iLength, szString, &rectlString, 0, 0, DT_BOTTOM | DT_QUERYEXTENT | DT_TEXTATTRS); while(rectlString.xRight > swp.cx) { iHalfLen = iLength / 2; if(iHalfLen == 2) break; ptr = szString + iHalfLen; memmove(ptr - 1, ptr, strlen(ptr) + 1); szString[iHalfLen - 2] = '.'; szString[iHalfLen - 1] = '.'; szString[iHalfLen] = '.'; iLength = strlen(szString); rectlString.xLeft = rectlString.yBottom = 0; rectlString.xRight = rectlString.yTop = 1000; WinDrawText(hps, iLength, szString, &rectlString, 0, 0, DT_BOTTOM | DT_QUERYEXTENT | DT_TEXTATTRS); } WinReleasePS(hps); WinSetWindowText(hwndST, szString); } break; } return WinDefFileDlgProc(hwndDlg, msg, mp1, mp2); }
MRESULT EXPENTRY tBarProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 ) { HENUM henum; RECTL rect; short height, i=0; HWND hwndHelp; char str[50]; HPS hps; switch( msg ) { case WM_CREATE: case WM_DESTROY: case WM_SIZE: break; case WM_COMMAND: WinSendMsg( WinQueryWindow( hwnd, QW_OWNER ), msg, mp1, mp2 ); break; case TB_REDRAW: henum = WinBeginEnumWindows( hwnd ); while( (hwndHelp = WinGetNextWindow( henum )) != 0 ) { WinSetWindowPos( hwndHelp, 0, i+2, 3, 0, 0, SWP_MOVE ); WinQueryWindowRect( hwndHelp, &rect ); i += rect.xRight; } break; case TB_ADDBUTTON: WinQueryWindowRect( hwnd, &rect ); height = rect.yTop - rect.yBottom; sprintf( str, "#%ld", (ULONG)mp1 ); hwndHelp = WinCreateWindow( hwnd, WC_BUTTON, str, WS_VISIBLE | BS_PUSHBUTTON | BS_BITMAP | BS_NOPOINTERFOCUS, 0, 0, height-4, height-4, hwnd, HWND_BOTTOM, (ULONG)mp1, 0, NULL ); oldButProc = WinSubclassWindow( hwndHelp, tButProc ); WinPostMsg( hwnd, TB_REDRAW, 0, 0 ); break; case TB_ADDSPACE: hwndHelp = WinCreateWindow( hwnd, WC_STATIC, NULL, !WS_VISIBLE, 0, 0, (ULONG)mp1, 0, hwnd, HWND_BOTTOM, 0, 0, NULL ); WinPostMsg( hwnd, TB_REDRAW, 0, 0 ); break; case TB_SETBITMAP: sprintf( str, "#%ld", (ULONG)mp2 ); hwndHelp = WinWindowFromID( hwnd, (USHORT)mp1 ); WinSetWindowText( hwndHelp, (PSZ)str ); WinPostMsg( hwnd, TB_REDRAW, 0, 0 ); break; case TB_REMOVEBUTTONID: hwndHelp = WinWindowFromID( hwnd, (USHORT) mp1 ); if( hwndHelp ) WinDestroyWindow( hwndHelp ); break; case TB_HWNDFROMID: return (MPARAM) WinWindowFromID( hwnd, (USHORT) mp1 ); case WM_PAINT: { RECTL rcl; POINTL pt; HPS hps = WinBeginPaint( hwnd, 0, 0 ); WinQueryWindowRect(hwnd,&rcl); WinFillRect( hps, &rcl, SYSCLR_BUTTONMIDDLE ); pt.x = rcl.xLeft; pt.y = rcl.yBottom; GpiSetColor( hps, SYSCLR_BUTTONLIGHT ); GpiMove( hps, &pt ); pt.x = rcl.xRight - 1; GpiLine( hps, &pt ); pt.x = rcl.xLeft; pt.y = rcl.yBottom + 1; GpiSetColor( hps, SYSCLR_BUTTONDARK ); GpiMove( hps, &pt ); pt.x = rcl.xRight - 1; GpiLine( hps, &pt ); rcl.yBottom += 2; WinEndPaint( hps ); } break; default: return WinDefWindowProc( hwnd, msg, mp1, mp2 ); } return FALSE; }
// Frame_window - окно рамки. HPOINTER Diver_QueryWindowIcon( HWND Frame_window ) { // Для некоторых окон есть значки по умолчанию, но устанавливать их нельзя. if( IsEPMEditorWindow( Frame_window ) || WindowIsCreatedBy( APP_EPM, Frame_window ) ) { if( Diver.RTSettings.EPM_icon == NULLHANDLE ) { ULONG Boot_drive = 0; DosQuerySysInfo( QSV_BOOT_DRIVE, QSV_BOOT_DRIVE, (PULONG) &Boot_drive, sizeof( Boot_drive ) ); if( Boot_drive ) { CHAR Path[ SIZE_OF_PATH ] = "*:"; Path[ 0 ] = (CHAR) Boot_drive + 64; strcat( Path, "\\OS2\\Apps\\Epm.exe" ); if( FileExists( Path ) ) Diver.RTSettings.EPM_icon = WinLoadFileIcon( Path, 0 ); } } if( Diver.RTSettings.EPM_icon != NULLHANDLE ) return Diver.RTSettings.EPM_icon; else return Resources.Default_icons[ ICON_VIEWDOC ]; } // Для некоторых окон значки по умолчанию можно установить раз и навсегда, отправив сообщение в окно. HPOINTER Icon = NULLHANDLE; if( Icon == NULLHANDLE ) { if( IsWinListWindow( Frame_window ) ) Icon = Resources.Default_icons[ ICON_WINLIST ]; } if( Icon == NULLHANDLE ) { if( WindowIsCreatedBy( APP_VIEWDOC, Frame_window ) ) Icon = Resources.Default_icons[ ICON_VIEWDOC ]; } if( Icon == NULLHANDLE ) { if( WindowIsCreatedBy( APP_PMCHKDSK, Frame_window ) ) { if( Diver.RTSettings.HDD_icon == NULLHANDLE ) { ULONG Boot_drive = 0; DosQuerySysInfo( QSV_BOOT_DRIVE, QSV_BOOT_DRIVE, (PULONG) &Boot_drive, sizeof( Boot_drive ) ); if( Boot_drive ) { CHAR Path[ SIZE_OF_PATH ] = "*:"; Path[ 0 ] = (CHAR) Boot_drive + 64; strcat( Path, "\\eCS\\Bin\\PMFormat.exe" ); if( FileExists( Path ) ) Diver.RTSettings.HDD_icon = WinLoadFileIcon( Path, 0 ); } } if( Diver.RTSettings.HDD_icon == NULLHANDLE ) { CHAR Path[ SIZE_OF_PATH ] = ""; HOBJECT WPDrives_object = QueryWPSObject( "<WP_DRIVES>" ); if( WPDrives_object != NULLHANDLE ) WinQueryObjectPath( WPDrives_object, Path, SIZE_OF_PATH ); if( Path[ 0 ] != 0 ) Diver.RTSettings.HDD_icon = WinLoadFileIcon( Path, 0 ); } if( Diver.RTSettings.HDD_icon != NULLHANDLE ) Icon = Diver.RTSettings.HDD_icon; } } if( Icon == NULLHANDLE ) { if( WindowIsCreatedBy( APP_APPLETVIEWER, Frame_window ) ) { HWND Related_window = FindRelatedFrameWindow( Frame_window, &IsHotJavaBrowserWindow ); if( Related_window != NULLHANDLE ) { Icon = (HPOINTER) WinSendMsg( Related_window, WM_QUERYICON, 0, 0 ); } } } // Если значок был выбран - ставим и возвращаем его. if( Icon != NULLHANDLE ) { if( DrawSystemMenusSettingIsON() ) { WinPostQueueMsg( Enhancer.Modules.Changer->Message_queue, SM_CHANGE_ICON, (MPARAM) Frame_window, (MPARAM) Icon ); } return Icon; } // Узнаем значок окна. Icon = (HPOINTER) WinSendMsg( Frame_window, WM_QUERYICON, 0, 0 ); // Если это пустой значок - ставим изображение по умолчанию. HWND Desktop = QueryDesktopWindow(); if( Icon == WinQuerySysPointer( Desktop, SPTR_APPICON, 0 ) ) { Icon = WinQuerySysPointer( Desktop, SPTR_PROGRAM, 0 ); if( DrawSystemMenusSettingIsON() ) { WinPostQueueMsg( Enhancer.Modules.Changer->Message_queue, SM_CHANGE_ICON, (MPARAM) Frame_window, (MPARAM) Icon ); } return Icon; } // Если значок неизвестен - возвращаем значок владельца, главного окна, или значок по умолчанию. // Менять значок во всех случаях нельзя - может возникнуть постоянное рисование, которое выглядит как "мигание" рамки. if( Icon == NULLHANDLE ) { // Узнаем окно рабочего стола. HWND Desktop = QueryDesktopWindow(); // Просматриваем всех владельцев. HWND Owner_window = WinQueryWindow( Frame_window, QW_FRAMEOWNER ); while( Owner_window != Desktop && Owner_window != NULLHANDLE ) { // Если владелец - окно рамки: if( IsFrameWindow( Owner_window ) ) { // Узнаем его значок. Icon = (HPOINTER) WinSendMsg( Owner_window, WM_QUERYICON, 0, 0 ); // Если он есть - возвращаем его. if( Icon != NULLHANDLE ) return Icon; } // Узнаем следующего владельца. Owner_window = WinQueryWindow( Owner_window, QW_FRAMEOWNER ); } // Узнаем главное окно приложения. HWND Main_window = QueryMainWindow( Frame_window ); // Если это другое окно: if( Main_window != Frame_window ) { // Узнаем его значок. Icon = (HPOINTER) WinSendMsg( Main_window, WM_QUERYICON, 0, 0 ); // Если он есть - возвращаем его. if( Icon != NULLHANDLE ) return Icon; } // Узнаем очередь сообщений окна. HMQ Message_queue = WinQueryWindowULong( Frame_window, QWL_HMQ ); // Узнаем окно оболочки. HWND Shell_window = GetDetectedShellWindow(); if( Shell_window != NULLHANDLE ) { // Узнаем очередь сообщений для окна оболочки. HMQ Shell_queue = WinQueryWindowULong( Shell_window, QWL_HMQ ); // Если очереди совпадают - возвращаем его значок. if( Shell_queue == Message_queue ) return (HPOINTER) WinSendMsg( Shell_window, WM_QUERYICON, 0, 0 ); // Если еще как-нибудь можно установить, что окно создано оболочкой - возвращаем значок окна оболочки. if( IsWorkplaceShellWindow( Frame_window ) ) return (HPOINTER) WinSendMsg( Shell_window, WM_QUERYICON, 0, 0 ); } { // Перебираем окна в окне рабочего стола. HENUM Enumeration = WinBeginEnumWindows( Desktop ); HWND Window = NULLHANDLE; while( ( Window = WinGetNextWindow( Enumeration ) ) != NULLHANDLE ) { // Если это то же самое окно - продолжаем перебор окон. if( Window == Frame_window ) continue; // Узнаем расположение окна и его состояние. SWP Window_state = {0}; WinQueryWindowPos( Window, &Window_state ); // Если окно не скрыто и не уменьшено в значок: if( !( Window_state.fl & SWP_HIDE ) ) if( !( Window_state.fl & SWP_MINIMIZE ) ) { // Если в это окно нельзя переключиться - продолжаем перебор окон. if( !PermissionForSwitching( Window ) ) continue; } // Узнаем очередь сообщений окна. HMQ Window_queue = WinQueryWindowULong( Window, QWL_HMQ ); // Если очереди совпадают - узнаем его значок. if( Window_queue == Message_queue ) { // Узнаем значок окна. Icon = (HPOINTER) WinSendMsg( Window, WM_QUERYICON, 0, 0 ); // Если он есть - возвращаем его. if( Icon != NULLHANDLE ) { // Завершаем перебор окон. WinEndEnumWindows( Enumeration ); // Возвращаем значок. return Icon; } } } WinEndEnumWindows( Enumeration ); } // Узнаем путь к приложению, создавшему окно. CHAR Path[ SIZE_OF_PATH ] = ""; GetDetectedExePath( Frame_window, Path ); // Если его удалось определить: if( Path[ 0 ] != 0 ) { // Узнаем имя приложения, создавшего окно. CHAR Name[ SIZE_OF_PATH ] = ""; GetDetectedExeName( Frame_window, Name ); // Составляем полный путь. strcat( Path, "\\" ); strcat( Path, Name ); // Загружаем значок для файла приложения. Icon = WinLoadFileIcon( Path, 0 ); // Загрузка длится долго, поэтому в этом случае надо заменить значок окна. При // повторной загрузке возможна утечка памяти, так что лучше сделать это немедленно, // не посылая сообщений в поток Changer. WinSendMsg( Frame_window, WM_SETICON, (MPARAM) Icon, 0 ); // Запоминаем, что значок был загружен с диска. BYTE Icon_was_loaded = 1; SetProperty( Frame_window, PRP_ICON_WAS_LOADED, &Icon_was_loaded ); // Возвращаем значок. return Icon; } // Для окон постоянного размера выбираем простой значок. if( WindowIsDialog( Frame_window ) ) { return Resources.Default_icons[ ICON_LEAF ]; } // Для остальных окон - он зависит от того, можно ли переключиться в окно. else { HSWITCH Switch_handle = WinQuerySwitchHandle( Frame_window, NULLHANDLE ); if( Switch_handle != NULLHANDLE ) return Resources.Default_icons[ ICON_LEAVES ]; else return Resources.Default_icons[ ICON_LEAF ]; } // И наконец, значок мог быть задан в свойствах раньше. FindProperty( Frame_window, PRP_ICON, &Icon ); } // Возврат. return Icon; }
INT main( INT argc, PCHAR argv[] ) { // Сбрасываем свойства приложения. bzero( &Enhancer, sizeof( ENHANCER ) ); // Определяем приложение в системе. Enhancer.Application = WinInitialize( 0 ); // Если это сделать не удалось - выход. if( Enhancer.Application == NULLHANDLE ) { // Звук - ошибка. WinAlarm( HWND_DESKTOP, WA_ERROR ); // Выход. DosExit( EXIT_PROCESS, 0 ); } // Создаем очередь сообщений. HMQ Message_queue = WinCreateMsgQueue( Enhancer.Application, 0 ); // Если очередь создать не удалось - выход. if( Message_queue == NULLHANDLE ) { // Звук - ошибка. WinAlarm( HWND_DESKTOP, WA_ERROR ); // Выход. WinTerminate( Enhancer.Application ); DosExit( EXIT_PROCESS, 0 ); } // Проверяем системные настройки. CheckSystemConfig(); // Запускаем составляющие приложения. StdLib_Start(); Strings_Start(); Files_Start(); Environment_Start(); EnhancerProperties_Start(); Loader_Start(); Launcher_Start(); // Узнаем, что надо сделать. if( argc == 2 ) { if( stristr( "hide", argv[ 1 ] ) ) Enhancer.Launcher_mode = 1; if( stristr( "mini", argv[ 1 ] ) ) Enhancer.Launcher_mode = 1; if( stristr( "launch", argv[ 1 ] ) ) Enhancer.Launcher_mode = 1; if( stristr( "enhance", argv[ 1 ] ) ) Enhancer.Enhancer_mode = 1; } // Возможно, надо вызвать окно настроек. if( argc == 2 ) { if( strstr( "ControlCenter", argv[ 1 ] ) ) { CHAR Path_to_ControlCenter[ SIZE_OF_PATH ] = ""; GetCurrentPath( Path_to_ControlCenter ); strcat( Path_to_ControlCenter, "\\Nice-eCS.exe" ); Execute( Path_to_ControlCenter, argv[ 1 ] ); WinDestroyMsgQueue( Message_queue ); WinTerminate( Enhancer.Application ); DosExit( EXIT_PROCESS, 0 ); } } // Если действие не распознано - выход. if( !Enhancer.Enhancer_mode && !Enhancer.Launcher_mode ) { WinDestroyMsgQueue( Message_queue ); WinTerminate( Enhancer.Application ); DosExit( EXIT_PROCESS, 0 ); } // Если окно приложения уже есть - выход. { CHAR Semaphore_name[] = "\\SEM32\\NICE-OS2!L"; HMTX hmtxAlreadyRunning = NULLHANDLE; if( Enhancer.Enhancer_mode ) Semaphore_name[ strlen( Semaphore_name ) - 1 ] = 'E'; if( DosOpenMutexSem( Semaphore_name, &hmtxAlreadyRunning ) == NO_ERROR ) { WinDestroyMsgQueue( Message_queue ); WinTerminate( Enhancer.Application ); DosExit( EXIT_PROCESS, 0 ); } else { DosCreateMutexSem( Semaphore_name, &hmtxAlreadyRunning, DC_SEM_SHARED, 1 ); } } // Загрузчик должен запускаться до расширителя. if( Enhancer.Launcher_mode ) { CHAR Semaphore_name[] = "\\SEM32\\NICE-OS2!E"; HMTX hmtxAlreadyRunning = NULLHANDLE; if( DosOpenMutexSem( Semaphore_name, &hmtxAlreadyRunning ) == NO_ERROR ) { WinDestroyMsgQueue( Message_queue ); WinTerminate( Enhancer.Application ); DosExit( EXIT_PROCESS, 0 ); } } // Расширитель должен запускаться после загрузчика if( Enhancer.Enhancer_mode ) { CHAR Semaphore_name[] = "\\SEM32\\NICE-OS2!L"; HMTX hmtxAlreadyRunning = NULLHANDLE; if( DosOpenMutexSem( Semaphore_name, &hmtxAlreadyRunning ) != NO_ERROR ) { WinDestroyMsgQueue( Message_queue ); WinTerminate( Enhancer.Application ); DosExit( EXIT_PROCESS, 0 ); } } // Если надо вызвать загрузчик: if( Enhancer.Launcher_mode ) { // Создаем поток для запуска расширителя. DosCreateThread( &Threads.Launcher, (PFNTHREAD) LauncherThread, 0, 0, STACK_SIZE ); } // Если надо вызвать расширитель: if( Enhancer.Enhancer_mode ) { // Пробуем найти окно загрузчика. HWND Launcher_window = NULLHANDLE; CHAR Launcher_title[] = "Nice-OS2!L"; { // Перебираем окна в окне рабочего стола. HENUM Enumeration = WinBeginEnumWindows( WinQueryDesktopWindow( Enhancer.Application, NULLHANDLE ) ); HWND Window = NULLHANDLE; while( ( Window = WinGetNextWindow( Enumeration ) ) != NULLHANDLE ) { // Узнаем заголовок окна. CHAR Window_title[ SIZE_OF_TITLE ] = ""; WinQueryWindowText( WinWindowFromID( Window, FID_TITLEBAR ), SIZE_OF_TITLE, Window_title ); // Если это окно расширителя - запоминаем его. if( strc( Window_title, Launcher_title ) ) { Launcher_window = Window; break; } } WinEndEnumWindows( Enumeration ); } // Если загрузчика нет - выход. // Вообще-то он должен быть, раз найден семафор, но кто знает... if( !Launcher_window ) { WinTerminate( Enhancer.Application ); DosExit( EXIT_PROCESS, 0 ); } // Создаем потоки, устанавливаем обработчики событий. BYTE Success = NiceLoadEnhancer( Enhancer.Application, 0, Launcher_window ); // Если это сделать не удалось - выход. if( !Success ) { WinTerminate( Enhancer.Application ); DosExit( EXIT_PROCESS, 0 ); } // Читаем настройки и загружаем изображения в расширитель. // Этот метод выполняется внутри Nice-os2.dll, но так как DLL использует // адресное пространство приложения, все данные остаются в этом приложении. NiceReadSettings( 0 ); // Включаем слежение за сообщениями. NiceRunEnhancer(); } // Создаем окно рабочей области. CHAR Class_name[] = "NiceOS2WndClass!L"; if( Enhancer.Enhancer_mode ) Class_name[ strlen( Class_name ) - 1 ] = 'E'; WinRegisterClass( Enhancer.Application, Class_name, (PFNWP) Enhancer_MainWindowProc, 0, 0 ); // Создаем окно рамки. CHAR MainWindow_title[] = "Nice-OS2!L"; if( Enhancer.Enhancer_mode ) Class_name[ strlen( Class_name ) - 1 ] = 'E'; ULONG Creation_flags = FCF_TITLEBAR | FCF_SYSMENU; Enhancer.Frame_window = WinCreateStdWindow( HWND_DESKTOP, CS_FRAME, &Creation_flags, Class_name, MainWindow_title, 0, NULLHANDLE, 0, &Enhancer.Client_window ); WinShowWindow( Enhancer.Frame_window, 0 ); // Выбираем сообщения из очереди. QMSG Message; bzero( &Message, sizeof( QMSG ) ); while( WinGetMsg( Enhancer.Application, &Message, 0, 0, 0 ) ) WinDispatchMsg( Enhancer.Application, &Message ); // Закрываем окна. WinDestroyWindow( Enhancer.Client_window ); WinDestroyWindow( Enhancer.Frame_window ); // Если вызван расширитель: if( Enhancer.Enhancer_mode ) { // Отключаем обработчики событий, завершаем работу потоков. NiceReleaseEnhancer( Enhancer.Application, 0 ); } // Удаляем файлы отладочной версии. DosForceDelete( "_log.txt" ); DosForceDelete( "XTest.exe" ); // Сбрасываем очередь сообщений. WinDestroyMsgQueue( Message_queue ); // Выход. WinTerminate( Enhancer.Application ); DosExit( EXIT_PROCESS, 0 ); }
BOOL launchPad::lpFillPad() { HOBJECT hObject; char chrSetup[CCHMAXPATH]; WPFolder* wpFolder; LPObject *lpoTemp; SWP swp; HWND hwndTemp; BTNCDATA btCtrl; WNDPARAMS wndParams; ULONG ulStyle; int a; LONG lXSize; HENUM hEnum; HWND hwndClient; LONG lCxSave; /* Remove Buttons from pad */ lpClearPad(); /* Resize the pad for all objects */ if(!WinQueryWindowPos(hwndLaunchPad, &swp)) return FALSE; lCxSave=swp.cx; lXSize=(ulNumObjects == 0 ? swp.cy : (ulNumObjects) * (swp.cy+xButtonDelta) +2*xButtonOffset); lpSetLaunchPadPos( NULLHANDLE,0,0, lXSize , swp.cy, SWP_SIZE); /* Move all controls on the right */ /* Move all client windows so they keep their distance to the left border */ hEnum=WinBeginEnumWindows(WinQueryWindow(hwndLaunchPad,QW_PARENT)); while((hwndClient=WinGetNextWindow(hEnum))!=NULLHANDLE) { SWP swpClient; WinQueryWindowPos(hwndClient,&swpClient); if(swpClient.x > swp.x) WinSetWindowPos(hwndClient, NULLHANDLE, swpClient.x+(lXSize-lCxSave), swpClient.y, 0, 0, SWP_MOVE); }/* while */ WinEndEnumWindows(hEnum); lpoTemp=lpoObjectList; for(a=ulNumObjects;a>0 && lpoTemp; a--) { /* Create Buttons */ if((hwndTemp=WinCreateWindow(hwndLaunchPad, WC_BUTTON, lpoTemp->chrName, WS_VISIBLE, xButtonOffset+(a-1)*(swp.cy+xButtonDelta), 1, swp.cy-2, swp.cy-2, hwndLaunchPad, HWND_TOP, a*100, NULLHANDLE, NULLHANDLE))!=NULLHANDLE) { /* Change Style to mini icon */ ulStyle=WinQueryWindowULong(hwndTemp,QWL_STYLE); ulStyle|=(BS_MINIICON); ulStyle&=~BS_TEXT; if(WinSetWindowULong(hwndTemp,QWL_STYLE,ulStyle)) { memset(&btCtrl,0,sizeof(btCtrl)); btCtrl.cb=sizeof(btCtrl); btCtrl.hImage=lpoTemp->hPtr; memset(&wndParams,0,sizeof(wndParams)); wndParams.fsStatus=WPM_CTLDATA; wndParams.cbCtlData=btCtrl.cb; wndParams.pCtlData=&btCtrl; WinSendMsg(hwndTemp,WM_SETWINDOWPARAMS, MPFROMP(&wndParams),0); /* Subclass button for flyover help */ oldButtonProc2=WinSubclassWindow(hwndTemp, newLaunchPadButtonProc); /* Set the class pointer into the window words */ WinSetWindowULong(hwndTemp,QWL_USER,(ULONG)lpoTemp);//Save object ptr. } } lpoTemp=lpoTemp->lpoNext; } return TRUE; }
MRESULT EXPENTRY MyWindowProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 ) { RECTL clientrect; /* Rectangle coordinates */ HPS hpsPaint; POINTL pt; /* String screen coordinates */ BOOL Invalid; int Line; ERRORID Err; HWND Focus,Active; HMQ hmqDeb; PID pid,cpid; TID tid,ctid; switch( msg ) { case WM_CREATE: WinStartTimer(hab,hwnd,1234,500); break; /* end the application. */ case WM_TIMER: rc=DosOpen("KBD$", &hKbd, &Action, 0, FILE_NORMAL, FILE_OPEN, OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE | OPEN_FLAGS_FAIL_ON_ERROR, 0); if (rc) { char Buf[80]; sprintf(Buf,"Open rc = %d",rc); WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, Buf, "TRAPIT", 1234, MB_OK); } /* endif */ Dlen= sizeof(State); rc = DosDevIOCtl( hKbd, 4, 0x73, 0, 0, 0, &State, sizeof(State), &Dlen ); Shift=(USHORT)State; DosClose(hKbd); Invalid=FALSE; if ((State&0x0500)==0x0500) { if (Color!=CLR_RED) { Color=CLR_RED; Invalid=TRUE; } /* endif */ Focus=WinQueryFocus(HWND_DESKTOP); Active=WinQueryActiveWindow(HWND_DESKTOP); WinQueryWindowProcess(Focus,&pid,&tid); hmqDeb=(HMQ)WinQueryWindowULong(Focus,QWL_HMQ); if (hmqDeb==hmq) { sprintf(Buffer,"Sorry Can't unhang Myself"); } else { DosKillProcess(DKP_PROCESS,pid); } /* endif */ } else { if ((State&0x0A00)==0x0A00) { if (Color!=CLR_BLUE) { Color=CLR_BLUE; Invalid=TRUE; } /* endif */ Focus=WinQueryFocus(HWND_DESKTOP); Active=WinQueryActiveWindow(HWND_DESKTOP); WinQueryWindowProcess(Focus,&pid,&tid); hmqDeb=(HMQ)WinQueryWindowULong(Focus,QWL_HMQ); if (hmqDeb==hmq) { sprintf(Buffer,"Sorry Can't trap Myself"); } else { HENUM hEnum; CHAR Class[20]; HWND Child; hEnum = WinBeginEnumWindows(HWND_OBJECT); while ( (Child=WinGetNextWindow(hEnum)) != 0) { WinQueryWindowProcess(Child,&cpid,&ctid); if (cpid==pid) { Class[0]=0; WinQueryClassName(Child,sizeof(Class)-1,Class); if (strcmp(Class,"Killer")==0) { if (WinPostMsg(Child,WM_USER+1,0,0)) { DosBeep(1800,80); DosBeep(600,80); DosBeep(1800,80); } } /* endif */ } /* endif */ } WinEndEnumWindows(hEnum); } /* endif */ } else { if (Color!=CLR_BACKGROUND) { Color=CLR_BACKGROUND; Invalid=TRUE; } } /* endif */ } /* endif */ if (Invalid) { WinInvalidateRect( hwnd, NULL, TRUE ); } /* endif */ break; case WM_PAINT: hpsPaint=WinBeginPaint( hwnd,0, &clientrect ); WinFillRect( hpsPaint, &clientrect,Color );/* Fill invalid rectangle */ pt.x = 10; pt.y = 190; /* Set the text coordinates, */ GpiCharStringAt( hpsPaint, &pt, (LONG)strlen(Buffer),Buffer); for (Line=0;Line<8;Line++ ) { pt.x = 10; pt.y = 170-(20*Line); /* Set the text coordinates, */ GpiCharStringAt( hpsPaint, &pt, (LONG)strlen(LabelText[Line]),LabelText[Line]); } /* endfor */ WinEndPaint( hpsPaint ); /* Drawing is complete */ break; case WM_CLOSE: /******************************************************************/ /* This is the place to put your termination routines */ /******************************************************************/ WinPostMsg( hwnd, WM_QUIT, 0L, 0L ); /* Cause termination */ break; default: /******************************************************************/ /* Everything else comes here. This call MUST exist */ /* in your window procedure. */ /******************************************************************/ return WinDefWindowProc( hwnd, msg, mp1, mp2 ); } return FALSE; }