home *** CD-ROM | disk | FTP | other *** search
- // PROGDDE.C -- Contains code to make progman add icons, etc.
-
- #include <windows.h>
- #include <dde.h>
- #include "bincode.h"
-
- char szProgman[] = "PROGMAN";
- HWND hWndServer = NULL; // Currently active DDE conversation
- BOOL fInitiate = FALSE;
- BOOL fAck = FALSE;
- HWND hWndProgman = NULL; // global handle of progman window
-
- /********************************************************************/
-
- WINPROC ddeWndProc ( WINDOWS_PARAMS )
- {
- HANDLE h;
- WORD fRelease;
-
- switch (msg)
- {
- case WM_DDE_TERMINATE:
-
- ddeTerminate (wParam);
- break;
-
- case WM_DDE_ACK:
-
- if (fInitiate)
- {
- if (wParam == FindWindow((LPSTR)szProgman, (LPSTR)NULL))
- hWndServer = wParam;
- GlobalDeleteAtom(LOWORD(lParam));
- }
- else
- {
- fAck = (LOWORD(lParam) & 0x8000);
- }
- GlobalDeleteAtom(HIWORD(lParam));
- break;
-
- #if 0
-
- case WM_DDE_DATA:
-
- h = LOWORD(lParam);
- lpData = (DDEDATA FAR *)GlobalLock(h);
- fRelease = lpData->fRelease;
- if (lpData->fAckReq)
- PostMessage(wParam,WM_DDE_ACK,hwnd,MAKELONG(0x8000,HIWORD(lParam)));
- else
- GlobalDeleteAtom(HIWORD(lParam));
- GlobalUnlock(h);
- if (ghData)
- DeleteData(ghData);
-
- if (fRelease)
- ghData = h;
- else
- ghData = CopyData(h);
-
- break;
- #endif
-
- default:
-
- return DefWindowProc(hWnd,msg,wParam,lParam);
- break;
-
- } // switch
- return 0L;
- }
-
- /********************************************************************/
-
- BOOL ddeInit (HANDLE hInst)
- {
- WNDCLASS rClass;
-
- rClass.hCursor = NULL;
- rClass.hIcon = NULL;
- rClass.lpszMenuName = NULL;
- rClass.lpszClassName = "ddeClass";
- rClass.hbrBackground = NULL;
- rClass.hInstance = hInst;
- rClass.style = 0;
- rClass.lpfnWndProc = ddeWndProc;
- rClass.cbClsExtra = 0;
- rClass.cbWndExtra = 0;
-
- if (! RegisterClass(&rClass) )
- return FALSE;
-
- /*
- * Create a window to handle our DDE mesage trafic
- */
-
- ghWndDDE = CreateWindow("ddeClass",
- NULL, 0L, 0, 0, 0, 0,
- (HWND)NULL, /* no parent */
- (HMENU)NULL, /* use class menu */
- (HANDLE)hInst, /* handle to window instance */
- (LPSTR)NULL /* no params to pass on */
- );
-
- return (BOOL)ghWndDDE;
- }
-
- /********************************************************************/
-
- BOOL ddeTerminate (HWND hWnd)
- {
- PostMessage (hWnd, WM_DDE_TERMINATE, ghWndDDE, 0L);
-
- if (hWnd == hWndServer)
- hWndServer = NULL;
-
- return TRUE;
- }
-
- /********************************************************************/
- /*
- /* SetProgmanSize - Makes Sure Progman is big so we can see the
- /* windows getting created
- /*
- /********************************************************************/
-
- void SetProgmanSize()
- {
- HDC hdc;
- int x1, y1, x2, y2;
- int xScreen, yScreen;
- char buf[80];
-
- #define MARGIN_SIZE(x) ((x) / 10)
-
- hdc = GetDC(NULL);
- xScreen = GetDeviceCaps(hdc, HORZRES);
- yScreen = GetDeviceCaps(hdc, VERTRES);
- ReleaseDC(NULL, hdc);
-
- x1 = MARGIN_SIZE(xScreen);
- y1 = MARGIN_SIZE(yScreen);
-
- x2 = xScreen - MARGIN_SIZE(xScreen);
- y2 = yScreen - 2*MARGIN_SIZE(yScreen);
-
- wsprintf(buf, "%d %d %d %d 1", x1, y1, x2, y2);
-
- WritePrivateProfileString("Settings", "Window", buf, "progman.ini");
- }
-
- /********************************************************************/
-
- HWND ddeSendInitiate(ATOM aApp, ATOM aTopic)
- {
- HWND hProgman = FindWindow( (LPSTR)szProgman, (LPSTR)NULL );
-
- fInitiate = TRUE;
- SendMessage( hProgman, WM_DDE_INITIATE, ghWndDDE, MAKELONG(aApp, aTopic));
- fInitiate = FALSE;
-
- return hWndServer;
- }
-
- /********************************************************************/
-
- HWND ddeInitiate (LPSTR szApp, LPSTR szTopic)
- {
- ATOM aApp;
- ATOM aTopic;
- HWND hwnd;
-
- aApp = GlobalAddAtom(szApp);
- aTopic = GlobalAddAtom(szTopic);
-
- // Try to start a conversation with the requested app
- hwnd = ddeSendInitiate(aApp, aTopic);
-
- // perhaps he is not running, try to exec him
- if (!hwnd)
- {
- if (!WinExec(szApp, SW_SHOWNORMAL))
- return NULL;
- hwnd = ddeSendInitiate(aApp, aTopic);
- }
-
- GlobalDeleteAtom(aApp);
- GlobalDeleteAtom(aTopic);
- return hwnd;
- }
-
- /********************************************************************/
-
- BOOL ddeWait(HWND hwnd)
- {
- MSG rMsg;
- BOOL fResult;
-
- LockData(0);
-
- while (GetMessage(&rMsg, NULL, WM_DDE_FIRST, WM_DDE_LAST))
- {
- TranslateMessage(&rMsg);
- DispatchMessage (&rMsg);
-
- if (rMsg.wParam == hwnd)
- {
- switch (rMsg.message)
- {
- case WM_DDE_ACK:
-
- fResult = fAck;
- goto exit;
-
- case WM_DDE_DATA:
-
- fResult = TRUE;
- goto exit;
-
- } // switch
-
- } // if
-
- } // while
-
- exit:
-
- UnlockData(0);
- return fResult;
- }
-
- /********************************************************************/
-
- BOOL ddeExec(HWND hwnd, LPSTR szCmd)
- {
- HANDLE hCmd;
- LPSTR lpCmd;
- BOOL bResult = FALSE;
-
- if (hCmd = GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE, (LONG)lstrlen(szCmd)+1))
- {
- lpCmd = GlobalLock(hCmd);
-
- if (lpCmd) // ONLY DO DDE if we have valid, lockable handle
- {
- lstrcpy (lpCmd,szCmd);
- GlobalUnlock(hCmd);
- PostMessage(hwnd, WM_DDE_EXECUTE, ghWndDDE, MAKELONG(NULL,hCmd));
- bResult = ddeWait(hwnd);
- }
-
- GlobalFree (hCmd);
- }
- return bResult;
- }
-
- /********************************************************************/
-
- BOOL fmActivate (PSTR szGroup)
- {
- char buf[80];
-
- wsprintf(buf, (LPSTR)"[creategroup(%s)]", (LPSTR)szGroup);
-
- return ddeExec(hWndProgman, buf);
-
- }
-
- /********************************************************************/
-
- BOOL fmMinimize(PSTR szGroup)
- {
- char buf[80];
-
- wsprintf(buf, "[showgroup(%s,2)]", (LPSTR)szGroup); // SW_SHOWMINIMIZED
-
- return ddeExec(hWndProgman, buf);
- }
-
- /********************************************************************/
-
- HWND ProgmanManageGroup (LPSTR szName, LPSTR szPath, BOOL fDelete)
- {
- char buf[80];
- char szCurDir[80];
-
-
- // STEP 1: Start the DDE Conversation if necessary
-
- if (!hWndProgman)
- {
- SetProgmanSize ();
-
- if (!(hWndProgman = ddeInitiate(szProgman, szProgman)))
- return NULL;
-
- // don't let crash happy user close progman by disabling it
-
- BringWindowToTop(hWndProgman);
- ShowWindow(hWndProgman, SW_RESTORE);
- EnableWindow(hWndProgman, FALSE);
- }
-
- // STEP 2: Add or Delete the group
-
- GetWindowsDirectory ( (LPSTR)szCurDir, 64 );
-
- if (fDelete)
- {
- wsprintf(buf, "[deletegroup(%s)]", (LPSTR)szName);
- ddeExec(hWndProgman, buf);
- }
- else
- {
- wsprintf(buf, (LPSTR)"[creategroup(%s,%s\\%s)]", (LPSTR)szName,
- (LPSTR)szCurDir,
- (LPSTR)szPath);
- ddeExec(hWndProgman, buf);
- }
-
- return hWndProgman;
- }
-
- /********************************************************************/
-
- BOOL ProgManClose()
- {
- EnableWindow(hWndProgman, TRUE); // undo don't let bozo close progman
-
- ddeExec(hWndProgman, "[exitprogman(1)]"); // close save state
-
- hWndServer = hWndProgman = NULL;
-
- return TRUE;
- }
-
- /********************************************************************
-
- szName = Icon Title
-
- szCmd = Fully Qualified Path of EXE
-
- ********************************************************************/
-
- BOOL ProgmanAddItem (PSTR szName, PSTR szCmd )
- {
- char buf[200];
-
- wsprintf((LPSTR)buf, (LPSTR)"[additem(%s,%s,%s,0)]", (LPSTR)szCmd,
- (LPSTR)szName,
- (LPSTR)szCmd );
-
- return ddeExec(hWndProgman, buf);
- }
-
-