home *** CD-ROM | disk | FTP | other *** search
/ Black Box 4 / BlackBox.cdr / w3_syst / setup.arj / PROGDDE.C < prev    next >
Encoding:
C/C++ Source or Header  |  1991-06-25  |  8.1 KB  |  358 lines

  1. // PROGDDE.C -- Contains code to make progman add icons, etc.
  2.  
  3. #include <windows.h>
  4. #include <dde.h>
  5. #include "bincode.h"
  6.  
  7. char    szProgman[]    = "PROGMAN";
  8. HWND    hWndServer    = NULL;      // Currently active DDE conversation
  9. BOOL    fInitiate    = FALSE;
  10. BOOL    fAck        = FALSE;
  11. HWND    hWndProgman    = NULL;         // global handle of progman window
  12.  
  13. /********************************************************************/
  14.  
  15. WINPROC ddeWndProc ( WINDOWS_PARAMS )
  16. {
  17.   HANDLE     h;
  18.   WORD       fRelease;
  19.  
  20.   switch (msg) 
  21.     {
  22.     case WM_DDE_TERMINATE:
  23.  
  24.        ddeTerminate (wParam);
  25.        break;
  26.  
  27.     case WM_DDE_ACK:
  28.  
  29.        if (fInitiate) 
  30.           {
  31.           if (wParam == FindWindow((LPSTR)szProgman, (LPSTR)NULL))
  32.             hWndServer = wParam;
  33.           GlobalDeleteAtom(LOWORD(lParam));
  34.           } 
  35.        else 
  36.           {
  37.           fAck = (LOWORD(lParam) & 0x8000);
  38.           }
  39.        GlobalDeleteAtom(HIWORD(lParam));
  40.        break;
  41.  
  42. #if 0
  43.  
  44.    case WM_DDE_DATA:
  45.  
  46.        h = LOWORD(lParam);
  47.        lpData = (DDEDATA FAR *)GlobalLock(h);
  48.        fRelease  = lpData->fRelease;
  49.        if (lpData->fAckReq)
  50.           PostMessage(wParam,WM_DDE_ACK,hwnd,MAKELONG(0x8000,HIWORD(lParam)));
  51.        else
  52.           GlobalDeleteAtom(HIWORD(lParam));
  53.        GlobalUnlock(h);
  54.        if (ghData)
  55.          DeleteData(ghData);
  56.  
  57.        if (fRelease)
  58.          ghData = h;
  59.        else
  60.          ghData = CopyData(h);
  61.  
  62.        break;
  63. #endif
  64.  
  65.    default:
  66.  
  67.        return DefWindowProc(hWnd,msg,wParam,lParam);
  68.        break;
  69.    
  70.    }  // switch
  71.  return 0L;
  72. }
  73.  
  74. /********************************************************************/
  75.  
  76. BOOL ddeInit (HANDLE hInst)
  77. {
  78.   WNDCLASS rClass;
  79.  
  80.   rClass.hCursor        = NULL;
  81.   rClass.hIcon          = NULL;
  82.   rClass.lpszMenuName   = NULL;
  83.   rClass.lpszClassName  = "ddeClass";
  84.   rClass.hbrBackground  = NULL;
  85.   rClass.hInstance      = hInst;
  86.   rClass.style          = 0;
  87.   rClass.lpfnWndProc    = ddeWndProc;
  88.   rClass.cbClsExtra     = 0;
  89.   rClass.cbWndExtra     = 0;
  90.  
  91.   if (! RegisterClass(&rClass) )
  92.      return FALSE;
  93.  
  94.   /*
  95.    * Create a window to handle our DDE mesage trafic
  96.    */
  97.  
  98.   ghWndDDE = CreateWindow("ddeClass", 
  99.                          NULL, 0L, 0, 0, 0, 0,
  100.                          (HWND)NULL,           /* no parent */
  101.                          (HMENU)NULL,          /* use class menu */
  102.                          (HANDLE)hInst,        /* handle to window instance */
  103.                          (LPSTR)NULL           /* no params to pass on */
  104.                         );
  105.  
  106.   return (BOOL)ghWndDDE;
  107. }
  108.  
  109. /********************************************************************/
  110.  
  111. BOOL ddeTerminate (HWND hWnd)
  112. {
  113.   PostMessage (hWnd, WM_DDE_TERMINATE, ghWndDDE, 0L);
  114.  
  115.   if (hWnd == hWndServer)
  116.     hWndServer = NULL;
  117.  
  118.   return TRUE;
  119. }
  120.  
  121. /********************************************************************/
  122. /*
  123. /*    SetProgmanSize - Makes Sure Progman is big so we can see the
  124. /*                     windows getting created
  125. /*
  126. /********************************************************************/
  127.  
  128. void SetProgmanSize()
  129. {
  130.     HDC hdc;
  131.     int x1, y1, x2, y2;
  132.     int xScreen, yScreen;
  133.     char    buf[80];
  134.  
  135.     #define MARGIN_SIZE(x)    ((x) / 10)
  136.  
  137.     hdc = GetDC(NULL);
  138.     xScreen = GetDeviceCaps(hdc, HORZRES);
  139.     yScreen = GetDeviceCaps(hdc, VERTRES);
  140.     ReleaseDC(NULL, hdc);
  141.  
  142.     x1 = MARGIN_SIZE(xScreen);
  143.     y1 = MARGIN_SIZE(yScreen);
  144.  
  145.     x2 = xScreen - MARGIN_SIZE(xScreen);
  146.     y2 = yScreen - 2*MARGIN_SIZE(yScreen);
  147.  
  148.     wsprintf(buf, "%d %d %d %d 1", x1, y1, x2, y2);
  149.  
  150.     WritePrivateProfileString("Settings", "Window", buf, "progman.ini");
  151. }
  152.  
  153. /********************************************************************/
  154.  
  155. HWND ddeSendInitiate(ATOM aApp, ATOM aTopic)
  156.   HWND hProgman = FindWindow( (LPSTR)szProgman, (LPSTR)NULL );
  157.  
  158.   fInitiate = TRUE;
  159.   SendMessage( hProgman, WM_DDE_INITIATE, ghWndDDE, MAKELONG(aApp, aTopic));
  160.   fInitiate = FALSE;
  161.  
  162.   return hWndServer;
  163. }
  164.  
  165. /********************************************************************/
  166.  
  167. HWND ddeInitiate (LPSTR szApp, LPSTR szTopic)
  168. {
  169.   ATOM   aApp;
  170.   ATOM   aTopic;
  171.   HWND   hwnd;
  172.  
  173.   aApp    = GlobalAddAtom(szApp);
  174.   aTopic  = GlobalAddAtom(szTopic);
  175.  
  176.   // Try to start a conversation with the requested app
  177.   hwnd = ddeSendInitiate(aApp, aTopic);
  178.  
  179.   // perhaps he is not running, try to exec him
  180.   if (!hwnd) 
  181.     {
  182.     if (!WinExec(szApp, SW_SHOWNORMAL))
  183.       return NULL;
  184.     hwnd = ddeSendInitiate(aApp, aTopic);
  185.     }
  186.  
  187.   GlobalDeleteAtom(aApp);
  188.   GlobalDeleteAtom(aTopic);
  189.   return hwnd;
  190. }
  191.  
  192. /********************************************************************/
  193.  
  194. BOOL ddeWait(HWND hwnd)
  195. {
  196.   MSG    rMsg;
  197.   BOOL   fResult;
  198.  
  199.   LockData(0);
  200.  
  201.   while (GetMessage(&rMsg, NULL, WM_DDE_FIRST, WM_DDE_LAST)) 
  202.     {
  203.     TranslateMessage(&rMsg);
  204.     DispatchMessage (&rMsg);
  205.  
  206.     if (rMsg.wParam == hwnd) 
  207.       {  
  208.       switch (rMsg.message) 
  209.         {
  210.         case WM_DDE_ACK:
  211.  
  212.           fResult = fAck;
  213.           goto exit;
  214.  
  215.         case WM_DDE_DATA:
  216.  
  217.           fResult = TRUE;
  218.           goto exit;
  219.  
  220.         }   // switch
  221.  
  222.       }  // if
  223.  
  224.     } // while
  225.  
  226. exit:
  227.  
  228.     UnlockData(0);
  229.     return fResult;
  230. }
  231.  
  232. /********************************************************************/
  233.  
  234. BOOL ddeExec(HWND hwnd, LPSTR szCmd)
  235. {
  236.   HANDLE hCmd;
  237.   LPSTR  lpCmd;
  238.   BOOL   bResult = FALSE;
  239.  
  240.   if (hCmd = GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE, (LONG)lstrlen(szCmd)+1)) 
  241.     {
  242.     lpCmd = GlobalLock(hCmd);
  243.  
  244.     if (lpCmd)  // ONLY DO DDE if we have valid, lockable handle
  245.       {
  246.       lstrcpy (lpCmd,szCmd);
  247.       GlobalUnlock(hCmd);
  248.       PostMessage(hwnd, WM_DDE_EXECUTE, ghWndDDE, MAKELONG(NULL,hCmd));
  249.       bResult = ddeWait(hwnd);
  250.       }
  251.  
  252.     GlobalFree (hCmd);
  253.     }
  254.   return bResult;
  255. }
  256.  
  257. /********************************************************************/
  258.  
  259. BOOL fmActivate (PSTR szGroup)
  260. {
  261.   char buf[80];
  262.  
  263.   wsprintf(buf, (LPSTR)"[creategroup(%s)]", (LPSTR)szGroup);
  264.  
  265.   return ddeExec(hWndProgman, buf);
  266.  
  267. }
  268.  
  269. /********************************************************************/
  270.  
  271. BOOL fmMinimize(PSTR szGroup)
  272. {
  273.   char buf[80];
  274.  
  275.   wsprintf(buf, "[showgroup(%s,2)]", (LPSTR)szGroup);     // SW_SHOWMINIMIZED
  276.  
  277.   return ddeExec(hWndProgman, buf);
  278. }
  279.  
  280. /********************************************************************/
  281.  
  282. HWND ProgmanManageGroup (LPSTR szName, LPSTR szPath, BOOL fDelete)
  283. {
  284.    char buf[80];
  285.    char szCurDir[80];
  286.  
  287.  
  288.    // STEP 1: Start the DDE Conversation if necessary
  289.  
  290.    if (!hWndProgman) 
  291.      {
  292.      SetProgmanSize ();
  293.  
  294.      if (!(hWndProgman = ddeInitiate(szProgman, szProgman)))
  295.        return NULL;
  296.  
  297.      // don't let crash happy user close progman by disabling it
  298.  
  299.      BringWindowToTop(hWndProgman);
  300.      ShowWindow(hWndProgman, SW_RESTORE);
  301.      EnableWindow(hWndProgman, FALSE);
  302.      }
  303.  
  304.    // STEP 2: Add or Delete the group
  305.  
  306.    GetWindowsDirectory ( (LPSTR)szCurDir, 64 );
  307.  
  308.    if (fDelete) 
  309.      {
  310.      wsprintf(buf, "[deletegroup(%s)]", (LPSTR)szName);
  311.      ddeExec(hWndProgman, buf);
  312.      }
  313.    else
  314.      {
  315.      wsprintf(buf, (LPSTR)"[creategroup(%s,%s\\%s)]", (LPSTR)szName, 
  316.                                                       (LPSTR)szCurDir, 
  317.                                                       (LPSTR)szPath);
  318.      ddeExec(hWndProgman, buf);
  319.      }
  320.  
  321.    return hWndProgman;
  322. }
  323.  
  324. /********************************************************************/
  325.  
  326. BOOL ProgManClose()
  327. {
  328.   EnableWindow(hWndProgman, TRUE);          // undo don't let bozo close progman
  329.  
  330.   ddeExec(hWndProgman, "[exitprogman(1)]");     // close save state
  331.  
  332.   hWndServer = hWndProgman = NULL;
  333.  
  334.   return TRUE;
  335. }
  336.  
  337. /********************************************************************
  338.  
  339.   szName = Icon Title
  340.  
  341.   szCmd  = Fully Qualified Path of EXE
  342.  
  343. ********************************************************************/
  344.  
  345. BOOL ProgmanAddItem (PSTR szName, PSTR szCmd )
  346. {
  347.   char buf[200];
  348.  
  349.   wsprintf((LPSTR)buf, (LPSTR)"[additem(%s,%s,%s,0)]", (LPSTR)szCmd, 
  350.                                                          (LPSTR)szName, 
  351.                                                          (LPSTR)szCmd );
  352.  
  353.   return ddeExec(hWndProgman, buf);
  354. }
  355.  
  356.  
  357.