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;
}
Example #5
0
 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;
}
Example #9
0
/*
 *   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;
}
Example #14
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);
}
Example #15
0
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;
}