wsexit.c
上传用户:xiaoan1112
上传日期:2013-04-11
资源大小:19621k
文件大小:7k
源码类别:

操作系统开发

开发平台:

Visual C++

  1. /***************************************************************************
  2. MODULE: wshelp.c  - Pretty much new for 3.1
  3.    Copyright (C) Microsoft, 1991
  4. HISTORY:
  5.    Modified by:      Date:       Comment:
  6.      Mikecole       7/23/91      Do away with RTF help window. Work for new
  7.                                  context sensitive help design.
  8. ***************************************************************************/
  9. #include "winenv.h"
  10. #include <file_io.h>
  11. #include "lib\common\sulib.h"
  12. #include "ws.h"
  13. #include "wsrc.h"
  14. #include "helpcon.h"
  15. // Local function prototypes.
  16. DWORD EXPORT wsSetupExit(int nCode, WORD wParam, DWORD lParam);
  17. // Globals to this module.
  18. char            szHelpFile[MAXSTR];
  19. static  BOOL  bHelpCalled = FALSE;
  20. FARPROC lpfnOldHook = NULL;
  21. FARPROC lpfnMyHook  = NULL;
  22. /* BOOL PUBLIC wsExitInit(void)
  23.  *
  24.  * Function will grab the name of the help file from setup.inf and put
  25.  * in the help hook.
  26.  *
  27.  * ENTRY: None.
  28.  *
  29.  * EXIT: BOOL - Success = TRUE. Failure == FALSE.
  30.  *
  31.  */
  32. BOOL PUBLIC wsExitInit(void)
  33. {
  34.    wsLoadSz(IDS_HELPFILE,szHelpFile,MAXSTR);
  35.    if (!(lpfnMyHook = MakeProcInstance((FARPROC)wsSetupExit, hInstWS)))
  36.       return FALSE;
  37.    lpfnOldHook = SetWindowsHook(WH_MSGFILTER,lpfnMyHook);
  38.    return TRUE;
  39. }
  40. /* DWORD EXPORT wsSetupHelp(int nCode, WORD wParam, DWORD lParam);
  41.  *
  42.  * This is the WH_MSGFILTER hook function for Windows setup. This functions
  43.  * purpose is to intercept help and exit requests and  convert them to
  44.  * the appropriate WM_COMMAND messages.
  45.  *
  46.  * ENTRY: nCode - Code value that tells this function where messages are
  47.  *                coming from; ie. dialog or message-box, keyb or mouse.
  48.  *
  49.  *        wParam - Always NULL.
  50.  *
  51.  *        lParam - Pointer to a MSG data structure.
  52.  *
  53.  * EXIT: Non-zero (TRUE) if this function processes the message. Otherwise FALSE.
  54.  *
  55.  */
  56. DWORD EXPORT wsSetupExit(nCode, wParam, lParam)
  57. int   nCode;
  58. WORD  wParam;
  59. DWORD lParam;
  60. {
  61.    LPMSG   lpMsg = (LPMSG)lParam;
  62.    WORD    wHelpContext = 0;
  63.    HWND    hDlgWnd = NULL, hWnd = NULL;
  64.    char    szClassName[25];
  65.    bHelpCalled = TRUE;
  66.    if ( nCode < 0 )
  67.       return DefHookProc(nCode, wParam, lParam, &lpfnOldHook);
  68.    /* First check that we received a message for dialog box   */
  69.    if ( nCode == MSGF_DIALOGBOX )
  70.    {
  71.        /* We want to process only keyboard messsages          */
  72.        if ( lpMsg->message == WM_KEYDOWN )
  73.        {
  74.          if ( lpMsg->wParam != VK_F3 )
  75.             return FALSE;
  76.          /* Now we have to detetrmine handle of current dialog window.
  77.           * We know that class name of all our dialogs is MYDLG so
  78.           * I am going through the chain of parent windows for current
  79.           * focus windows until I will find parent dialog or NULL.
  80.           */
  81.          hWnd = lpMsg->hwnd;
  82.          while ( hWnd )
  83.          {
  84.              *szClassName = '';
  85.              GetClassName(hWnd,szClassName,sizeof(szClassName));
  86.              AnsiUpper(szClassName);
  87.              if ( lstrcmpi((LPSTR)szClassName,(LPSTR)CLS_MYDLGS) == 0 )
  88.                break;
  89.              hWnd = GetParent(hWnd);
  90.          }
  91.          /* Did we find anything ???                          */
  92.          if ( ! hWnd )
  93.             return FALSE;
  94.          /* Convert keyboard messages came into WM_COMMANDs to
  95.           * the found dialog. Return TRUE because we procecessed
  96.           */
  97.          switch (lpMsg->wParam)
  98.          {
  99.             case VK_F3:                        
  100.                PostMessage(hWnd,WM_COMMAND,ID_EXIT,(LONG)lpMsg->lParam);
  101.                return TRUE;
  102.                break;
  103.          }
  104.        }
  105.    }
  106.    return FALSE;
  107. }
  108. /* LONG EXPORT wsDefSetupDlgProc(HWND hwnd, unsigned msg, WORD wParam,
  109.  *                               LONG lParam);
  110.  *
  111.  * Function acts as setup's DefDialogProc(). We use this to process Help and
  112.  * Exit button usage so that we don't have to put code into each of our dialog
  113.  * procs to do this. The way it works is we filter all the dialog message for
  114.  * WM_COMMAND - ID_HELP/ID_EXIT messages, these we process right here. The rest
  115.  * of the messages are passed on to DefDialogProc().
  116.  *
  117.  * ENTRY: hwnd   - Handle to dialog box who received the focus.
  118.  *        msg    - Message.
  119.  *        wParam - Message dependent.
  120.  *        lParam - Message dependent.
  121.  *
  122.  * EXIT:  BOOL   - TRUE if message processed, FALSE if not.
  123.  *
  124.  */
  125. LONG EXPORT wsDefSetupDlgProc(HWND hwnd, WORD msg, WORD wParam, LONG lParam)
  126. {
  127.    switch(msg)
  128.    {
  129.       case WM_KEYDOWN:
  130.          switch(wParam)
  131.          {
  132.             case VK_F1:
  133.                SendMessage(hwnd,WM_COMMAND,ID_HELP,lParam);
  134.                break;
  135.             case VK_F3:
  136.                SendMessage(hwnd,WM_COMMAND,ID_EXIT,lParam);
  137.                break;
  138.          }
  139.          break;
  140.       case WM_SYSCOMMAND:           // suppress taskman
  141.          if(wParam == SC_TASKLIST)
  142.             return TRUE;
  143.          break;
  144.       case WM_COMMAND:
  145.          switch(wParam)
  146.          {
  147.             case ID_EXIT:
  148.                if ( QueryExit(NULL) ) {
  149.                   if ( hwndParent )
  150.                      DestroyWindow(hwndParent);
  151.                   CleanUpDroppings();
  152.                   AppQuit();
  153.                }
  154.                break;
  155.            
  156.             case ID_HELP:
  157.             {
  158.                HWND hContextWnd;
  159.                WORD wHelpContext = 0;
  160.                hContextWnd = GetWindow(hwnd, GW_CHILD);
  161.                wHelpContext = GetWindowWord(hContextWnd, GWW_ID);
  162.                if ( (wHelpContext >= HELP_CONTEXT_MIN) && (wHelpContext <= HELP_CONTEXT_MAX) )
  163.                {
  164.                   bHelpCalled = WinHelp(hwnd,szHelpFile,HELP_CONTEXT,(LONG)wHelpContext);
  165.                   WinHelp(hwnd,szHelpFile,HELP_SETINDEX,DOS2GUI_INDEX);
  166.                   if (! bHelpCalled)
  167.                   {
  168.                      MessageBox(hwnd, wsLoadSz(IDS_HELP_ERROR, NULL, 0), NULL,
  169.                                 MB_APPLMODAL | MB_OK);
  170.                      WinHelp(hwnd, szHelpFile, HELP_QUIT, 0L);
  171.                   }
  172.                }
  173.                return(TRUE);
  174.             }
  175.          }
  176.    }
  177.    return(DefDlgProc(hwnd, msg, wParam, lParam));
  178. }
  179. /* VOID PUBLIC wsExitTerm(HWND hwnd);
  180.  *
  181.  * Function properly cleans up after setup's help usage by telling
  182.  * the engine we no longer need it and un-hooking the message filter
  183.  * we put in when we started.
  184.  *
  185.  * ENTRY: hWnd - Handle to parent window.
  186.  *
  187.  * EXIT: none.
  188.  *
  189.  */
  190. VOID PUBLIC wsExitTerm(hwnd)
  191. HWND hwnd;
  192. {
  193. if ( bHelpCalled )
  194. WinHelp(hwnd, szHelpFile, HELP_QUIT, 0L);
  195.    if ( lpfnMyHook )
  196.       UnhookWindowsHook(WH_MSGFILTER, lpfnMyHook);
  197. }
  198. /* void PUBLIC CleanUpDroppings(void);
  199.  *
  200.  * Function cleans up any temporarialy copied files along with any other
  201.  * house keeping that needs to be done when the user either completes or
  202.  * terminates DOS install.
  203.  *
  204.  * ENTRY: None.
  205.  *
  206.  * EXIT: None.
  207.  *
  208.  */
  209. void PUBLIC CleanUpDroppings(void)
  210. {
  211.    char  szTmp[MAXFILESPECLEN];
  212.    GetWindowsDirectory(szTmp,sizeof(szTmp));  // Where are we ?
  213.    catpath(szTmp,szHelpFile);                 // Build FQP to the victim.
  214.    AbsUnlink(szTmp);                          // The kill.
  215. }