home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2001 December (DVD) / VPR0112A.ISO / OLS / TCL230JA95 / tcl230ja95.lzh / source.lzh / exe / main.c < prev    next >
C/C++ Source or Header  |  2001-02-17  |  13KB  |  537 lines

  1. /*-------------------------------------------------------------
  2.   main.c
  3.   WinMain, window procedure, and functions for initializing
  4.   KAZUBON 1997-2001
  5. ---------------------------------------------------------------*/
  6.  
  7. #include "tclock.h"
  8. #include <winver.h>
  9.  
  10. // Globals
  11. HINSTANCE g_hInst;           // instance handle
  12. HINSTANCE g_hInstResource;   // instance handle of language module
  13. HWND      g_hwndMain;        // main window
  14. HWND      g_hwndClock;       // clock window
  15. HWND      g_hwndSheet;       // property sheet window
  16. HWND      g_hDlgTimer;       // timer dialog
  17. HICON     g_hIconTClock, g_hIconPlay, g_hIconStop, g_hIconDel;
  18.                              // icons to use frequently
  19. char      g_mydir[MAX_PATH]; // path to tclock.exe
  20. char      g_langdllname[MAX_PATH];  // language dll name
  21.  
  22. #define VERSIONM 0x20003
  23. #define VERSIONL 0x0000
  24.  
  25. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  26.  
  27. char szClassName[] = "TClockMainClass"; // window class name
  28. char szWindowText[] = "TClock";         // caption of the window
  29.  
  30. static BOOL bMenuOpened = FALSE;
  31.  
  32. void CheckCommandLine(HWND hwnd);
  33. static void InitError(int n);
  34. static BOOL CheckTCDLL(void);
  35. static BOOL CheckDLL(char *fname);
  36. static void CheckRegistry(void);
  37. static UINT s_uTaskbarRestart = 0;
  38. static BOOL bStartTimer = FALSE;
  39. static int nCountFindingClock = -1;
  40.  
  41. // XButton Messages
  42. #define WM_XBUTTONDOWN 0x020B
  43. #define WM_XBUTTONUP   0x020C
  44.  
  45. // menu.c
  46. extern HMENU g_hMenu;
  47.  
  48. // alarm.c
  49. extern BOOL bPlayingNonstop;
  50.  
  51. /*-------------------------------------------
  52.   entry point of program
  53.   not use "WinMain" for compacting the file size
  54. ---------------------------------------------*/
  55. void WINAPI WinMainCRTStartup(void)
  56. {
  57.     MSG msg;
  58.     WNDCLASS wndclass;
  59.     HWND hwnd;
  60.     
  61.     // not to execute the program twice
  62.     hwnd = FindWindow(szClassName, szWindowText);
  63.     if(hwnd != NULL)
  64.     {
  65.         CheckCommandLine(hwnd);
  66.         ExitProcess(1); return;
  67.     }
  68.     
  69.     g_hInst = GetModuleHandle(NULL);
  70.     
  71.     // get the path where .exe is positioned
  72.     GetModuleFileName(g_hInst, g_mydir, MAX_PATH);
  73.     del_title(g_mydir);
  74.     
  75.     if(!CheckTCDLL()) { ExitProcess(1); return; }
  76.     
  77.     g_hInstResource = LoadLanguageDLL(g_langdllname);
  78.     if(g_hInstResource == NULL) { ExitProcess(1); return; }
  79.     
  80.     InitCommonControls();
  81.     
  82.     CheckRegistry();
  83.     
  84.     // Message of the taskbar recreating
  85.     // Special thanks to Mr.Inuya
  86.     s_uTaskbarRestart = RegisterWindowMessage("TaskbarCreated");
  87.     
  88.     g_hIconTClock = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_ICON1));
  89.     g_hIconPlay = LoadImage(g_hInst, MAKEINTRESOURCE(IDI_PLAY), IMAGE_ICON,
  90.         16, 16, LR_DEFAULTCOLOR);
  91.     g_hIconStop = LoadImage(g_hInst, MAKEINTRESOURCE(IDI_STOP), IMAGE_ICON,
  92.         16, 16, LR_DEFAULTCOLOR);
  93.     g_hIconDel = LoadImage(g_hInst, MAKEINTRESOURCE(IDI_DEL), IMAGE_ICON,
  94.         16, 16, LR_DEFAULTCOLOR);
  95.     
  96.     g_hwndSheet = g_hDlgTimer = NULL;
  97.     
  98.     // register a window class
  99.     wndclass.style         = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  100.     wndclass.lpfnWndProc   = WndProc;
  101.     wndclass.cbClsExtra    = 0;
  102.     wndclass.cbWndExtra    = 0;
  103.     wndclass.hInstance     = g_hInst;
  104.     wndclass.hIcon         = g_hIconTClock;
  105.     wndclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
  106.     wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  107.     wndclass.lpszMenuName  = NULL;
  108.     wndclass.lpszClassName = szClassName;
  109.     RegisterClass(&wndclass);
  110.     
  111.     // create a hidden window
  112.     hwnd = CreateWindowEx(WS_EX_TOOLWINDOW, szClassName, szWindowText,
  113.         0, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
  114.         NULL, NULL, g_hInst, NULL);
  115.     //ShowWindow(hwnd, SW_SHOW);
  116.     //UpdateWindow(hwnd);
  117.  
  118.     g_hwndMain = hwnd;
  119.     
  120.     CheckCommandLine(hwnd);
  121.     
  122.     while(GetMessage(&msg, NULL, 0, 0))
  123.     {
  124.         if(g_hwndSheet && IsWindow(g_hwndSheet)
  125.             && IsDialogMessage(g_hwndSheet, &msg))
  126.             ;
  127.         else if(g_hDlgTimer && IsWindow(g_hDlgTimer)
  128.             && IsDialogMessage(g_hDlgTimer, &msg))
  129.             ;
  130.         else
  131.         {
  132.             TranslateMessage(&msg);
  133.             DispatchMessage(&msg);
  134.         }
  135.     }
  136.     
  137.     if(g_hMenu) DestroyMenu(g_hMenu);
  138.     
  139.     if(g_hInstResource) FreeLibrary(g_hInstResource);
  140.     
  141.     ExitProcess(msg.wParam);
  142. }
  143.  
  144. /*-------------------------------------------
  145.    Command Line Option
  146.    /prop : Show TClock Properties
  147.    /exit : Exit TClock
  148. ---------------------------------------------*/
  149. void CheckCommandLine(HWND hwnd)
  150. {
  151.     char *p;
  152.     p = GetCommandLine();
  153.     while(*p)
  154.     {
  155.         if(*p == '/')
  156.         {
  157.             p++;
  158.             if(_strnicmp(p, "prop", 4) == 0)
  159.             {
  160.                 PostMessage(hwnd, WM_COMMAND, IDC_SHOWPROP, 0);
  161.                 p += 4;
  162.             }
  163.             else if(_strnicmp(p, "exit", 4) == 0)
  164.             {
  165.                 PostMessage(hwnd, WM_CLOSE, 0, 0);
  166.                 p += 4;
  167.             }
  168.         }
  169.         p++;
  170.     }
  171. }
  172.  
  173. /*-------------------------------------------
  174.    the window procedure
  175. ---------------------------------------------*/
  176. LRESULT CALLBACK WndProc(HWND hwnd,    UINT message, WPARAM wParam, LPARAM lParam)
  177. {
  178.     switch (message)
  179.     {
  180.         case WM_CREATE:
  181.         {
  182.             int nDelay;
  183.             InitAlarm();  // initialize alarms
  184.             InitFormat(); // initialize a Date/Time format
  185.             nDelay = GetMyRegLong("", "DelayStart", 0);
  186.             if(nDelay > 0)
  187.             {
  188.                 SetTimer(hwnd, 2, nDelay * 1000, NULL); bStartTimer = TRUE;
  189.             }
  190.             else SendMessage(hwnd, WM_TIMER, 2, 0);
  191.             InitSyncTime(hwnd);
  192.             InitWatchWallpaper();
  193.             InitMouseFunction();
  194.             SetTimer(hwnd, 3, 1000, NULL);
  195.             return 0;
  196.         }
  197.         case WM_TIMER:
  198.             if(wParam == 2)
  199.             {
  200.                 if(bStartTimer) KillTimer(hwnd, 2);
  201.                 bStartTimer = FALSE;
  202.                 HookStart(hwnd); // install a hook
  203.                 nCountFindingClock = 0;
  204.             }
  205.             else if(wParam == 3)
  206.             {
  207.                 SYSTEMTIME st;
  208.                 GetLocalTime(&st);
  209.                 OnTimerSNTP(hwnd, &st);
  210.                 CheckAlarm(hwnd, &st);
  211.                 CheckTimer(hwnd, &st);
  212.                 CheckWallpaper(hwnd, &st);
  213.                 
  214.                 if(0 <= nCountFindingClock && nCountFindingClock < 20)
  215.                     nCountFindingClock++;
  216.                 else if(nCountFindingClock == 20)
  217.                 {
  218.                     nCountFindingClock++;
  219.                     InitError(4);
  220.                     PostMessage(hwnd, WM_CLOSE, 0, 0);
  221.                 }
  222.             }
  223.             else if(wParam == IDTIMER_MOUSE)
  224.                 OnTimerMouse(hwnd);
  225.             return 0;
  226.         
  227.         case WM_DESTROY:
  228.             EndSyncTime(hwnd);
  229.             EndAlarm();
  230.             EndTimer();
  231.             EndWatchWallpaper();
  232.             // MyHelp(hwnd, -1);
  233.             KillTimer(hwnd, 3);
  234.             if(bStartTimer)
  235.             {
  236.                 KillTimer(hwnd, 2); bStartTimer = FALSE;
  237.             }
  238.             else HookEnd();  // uninstall a hook
  239.             PostQuitMessage(0);
  240.             return 0;
  241.         case WM_ENDSESSION:
  242.             if(wParam)
  243.             {
  244.                 EndSyncTime(hwnd);
  245.                 EndAlarm();
  246.                 EndTimer();
  247.                 if(bStartTimer)
  248.                 {
  249.                     KillTimer(hwnd, 2); bStartTimer = FALSE;
  250.                 }
  251.                 else HookEnd();  // uninstall a hook
  252.             }
  253.             break;
  254.         case WM_PAINT:
  255.         {
  256.             PAINTSTRUCT ps;
  257.             HDC hdc;
  258.             hdc = BeginPaint(hwnd, &ps);
  259.             EndPaint(hwnd, &ps);
  260.             return 0;
  261.         }
  262.         
  263.         // Messages sent/posted from TCDLL.dll
  264.         case WM_USER:
  265.             nCountFindingClock = -1;
  266.             g_hwndClock = (HWND)lParam;
  267.             return 0;
  268.         case (WM_USER+1):   // error
  269.             nCountFindingClock = -1;
  270.             InitError(lParam);
  271.             PostMessage(hwnd, WM_CLOSE, 0, 0);
  272.             return 0;
  273.         case (WM_USER+2):   // exit
  274.             if(g_hwndSheet && IsWindow(g_hwndSheet))
  275.                 PostMessage(g_hwndSheet, WM_CLOSE, 0, 0);
  276.             if(g_hDlgTimer && IsWindow(g_hDlgTimer))
  277.                 PostMessage(g_hDlgTimer, WM_CLOSE, 0, 0);
  278.             g_hwndSheet = NULL;
  279.             g_hDlgTimer = NULL;
  280.             PostMessage(hwnd, WM_CLOSE, 0, 0);
  281.             return 0;
  282.         case MM_MCINOTIFY:
  283.             OnMCINotify(hwnd);
  284.             return 0;
  285.         case MM_WOM_DONE: // stop playing wave
  286.         case (WM_USER+3):
  287.             StopFile();
  288.             return 0;
  289.         case WM_WININICHANGE:
  290.         /*
  291.         {
  292.             char s[160];
  293.             strcpy(s, "WM_WININICHANGE ");
  294.             if(lParam) strcat(s, (char*)lParam);
  295.             else strcat(s, "(null)");
  296.             WriteDebug(s);
  297.         }
  298.         */
  299.         {
  300.             char *p;
  301.             BOOL b;
  302.  
  303.             p = (char*)lParam;
  304.             b = GetMyRegLong("", "DeskcalTonikaku", FALSE);
  305.             
  306.             // Update Destop Calendar automatically
  307.             if(p && (strcmp(p, "Desktop") == 0 ||
  308.                  strcmp(p, "RefreshDesktop") == 0)) ; // fall through
  309.             else if(b && (p == 0 || *p == 0)) ; // fall through
  310.             else return 0;
  311.         }
  312.         case WM_SYSCOLORCHANGE:
  313.             PostMessage(hwnd, WM_USER+10, 1,0);
  314.             return 0;
  315.         case (WM_USER+10):
  316.         {
  317.             if(wParam && GetMyRegLong("", "DeskcalOnlyDate", FALSE)) ;
  318.             else ExecDeskcal(hwnd);
  319.             return 0;
  320.         }
  321.         
  322.         // return from power saving
  323.         case WM_POWERBROADCAST:
  324.         {
  325.             if(wParam == 7) //PBT_APMRESUMESUSPEND
  326.             {
  327.                 if(GetMyRegLong("", "DeskcalResumeSuspend", FALSE))
  328.                     PostMessage(hwnd, WM_USER+10, 0,0);
  329.             }
  330.             break;
  331.         }
  332.         
  333.         // context menu
  334.         case WM_COMMAND:
  335.             OnTClockCommand(hwnd, LOWORD(wParam), HIWORD(wParam)); // menu.c
  336.             return 0;
  337.         // messages transfered from the dll
  338.         case WM_CONTEXTMENU:
  339.             // menu.c
  340.             OnContextMenu(hwnd, (HWND)wParam, LOWORD(lParam), HIWORD(lParam));
  341.             return 0;
  342.         case WM_DROPFILES:
  343.             OnDropFiles(hwnd, (HDROP)wParam); // mouse.c
  344.             return 0;
  345.         case WM_LBUTTONDOWN:
  346.         case WM_RBUTTONDOWN:
  347.         case WM_MBUTTONDOWN:
  348.         case WM_XBUTTONDOWN:
  349.             if(!bPlayingNonstop)
  350.                 PostMessage(hwnd, WM_USER+3, 0, 0);
  351.         case WM_LBUTTONUP:
  352.         case WM_RBUTTONUP:
  353.         case WM_MBUTTONUP:
  354.         case WM_XBUTTONUP:
  355.             OnMouseMsg(hwnd, message, wParam, lParam); // mouse.c
  356.             return 0;
  357.         case WM_ENTERMENULOOP:
  358.             bMenuOpened = TRUE;
  359.             break;
  360.         case WM_EXITMENULOOP:
  361.             bMenuOpened = FALSE;
  362.             break;
  363.     }
  364.     
  365.     if(message == s_uTaskbarRestart) // When Explorer is hung up,
  366.     {                                // and the taskbar is recreated.
  367.         HookEnd();
  368.         SetTimer(hwnd, 2, 1000, NULL); bStartTimer = TRUE;
  369.     }
  370.     
  371.     return DefWindowProc(hwnd, message, wParam, lParam);
  372. }
  373.  
  374. /*-------------------------------------------------------
  375.   show a message when TClock failed to customize the clock
  376. ---------------------------------------------------------*/
  377. void InitError(int n)
  378. {
  379.     char s[160];
  380.     
  381.     wsprintf(s, "%s: %d", MyString(IDS_NOTFOUNDCLOCK), n);
  382.     MyMessageBox(NULL, s, "Error", MB_OK, MB_ICONEXCLAMATION);
  383. }
  384.  
  385. /*-------------------------------------------
  386.   load a language dll
  387. ---------------------------------------------*/
  388. HINSTANCE LoadLanguageDLL(char *langdllname)
  389. {
  390.     HINSTANCE hInst = NULL;
  391.     char fname[MAX_PATH];
  392.     WIN32_FIND_DATA fd;
  393.     HANDLE hfind = INVALID_HANDLE_VALUE;
  394.     
  395.     GetMyRegStr("", "LangDLL", fname, MAX_PATH, "");
  396.     if(fname[0])
  397.     {
  398.         hfind = FindFirstFile(fname, &fd);
  399.         if(hfind != INVALID_HANDLE_VALUE) FindClose(hfind);
  400.     }
  401.     if(hfind == INVALID_HANDLE_VALUE)
  402.     {
  403.         strcpy(fname, g_mydir); add_title(fname, "lang*.tclock");
  404.         hfind = FindFirstFile(fname, &fd);
  405.         if(hfind != INVALID_HANDLE_VALUE)
  406.         {
  407.             FindClose(hfind);
  408.             del_title(fname); add_title(fname, fd.cFileName);
  409.         }
  410.     }
  411.     
  412.     if(hfind != INVALID_HANDLE_VALUE)
  413.     {
  414.         if(!CheckDLL(fname)) return NULL;
  415.         hInst = LoadLibrary(fname);
  416.     }
  417.     
  418.     if(hInst == NULL)
  419.         MyMessageBox(NULL, "Can't load a language module.",
  420.             "Error", MB_OK, MB_ICONEXCLAMATION);
  421.     else strcpy(langdllname, fname);
  422.     return hInst;
  423. }
  424.  
  425. HINSTANCE GetLangModule(void)
  426. {
  427.     return g_hInstResource;
  428. }
  429.  
  430. /*-------------------------------------------
  431.   Check version of dll
  432. ---------------------------------------------*/
  433. BOOL CheckTCDLL(void)
  434. {
  435.     char fname[MAX_PATH];
  436.     
  437.     strcpy(fname, g_mydir); add_title(fname, "tcdll.tclock");
  438.     return CheckDLL(fname);
  439. }
  440.  
  441. /*-------------------------------------------
  442.   Check version of dll
  443. ---------------------------------------------*/
  444. BOOL CheckDLL(char *fname)
  445. {
  446.     DWORD size;
  447.     char *pBlock;
  448.     VS_FIXEDFILEINFO *pffi;
  449.     BOOL br = FALSE;
  450.     
  451.     size = GetFileVersionInfoSize(fname, 0);
  452.     if(size > 0)
  453.     {
  454.         pBlock = malloc(size);
  455.         if(GetFileVersionInfo(fname, 0, size, pBlock))
  456.         {
  457.             UINT tmp;
  458.             if(VerQueryValue(pBlock, "\\", &pffi, &tmp))
  459.             {
  460.                 if(pffi->dwFileVersionMS == VERSIONM &&
  461.                     pffi->dwFileVersionLS == VERSIONL)
  462.                 {
  463.                     br = TRUE;
  464.                 }
  465.             }
  466.         }
  467.         free(pBlock);
  468.     }
  469.     if(!br)
  470.     {
  471.         char msg[MAX_PATH+30];
  472.         
  473.         strcpy(msg, "Invalid file version: ");
  474.         get_title(msg + strlen(msg), fname);
  475.         MyMessageBox(NULL, msg,
  476.             "Error", MB_OK, MB_ICONEXCLAMATION);
  477.     }
  478.     return br;
  479. }
  480.  
  481. /*-------------------------------------------
  482.   Show "TClock Help"
  483. ---------------------------------------------*/
  484. void MyHelp(HWND hwnd, int id)
  485. {
  486.     char helpurl[1024];
  487.     char s[20];
  488.     
  489.     GetMyRegStr("", "HelpURL", helpurl, 1024, "");
  490.     if(helpurl[0] == 0)
  491.     {
  492.         WIN32_FIND_DATA fd;
  493.         HANDLE hfind;
  494.         strcpy(helpurl, g_mydir);
  495.         add_title(helpurl, "help\\index.html");
  496.         hfind = FindFirstFile(helpurl, &fd);
  497.         if(hfind != INVALID_HANDLE_VALUE)
  498.             FindClose(hfind);
  499.         else
  500.             strcpy(helpurl, MyString(IDS_HELPURL));
  501.     }
  502.     if(id != 0)
  503.     {
  504.         if(strlen(helpurl) > 0 && helpurl[ strlen(helpurl) - 1 ] != '/')
  505.             del_title(helpurl);
  506.         wsprintf(s, "%d.html", id);
  507.         add_title(helpurl, s);
  508.     }
  509.     
  510.     ShellExecute(hwnd, NULL, helpurl, NULL, "", SW_SHOW);
  511. }
  512.  
  513. /*------------------------------------------------
  514.   load and save strings for TCDLL.dll
  515. --------------------------------------------------*/
  516. void CheckRegistry(void)
  517. {
  518.     char s[80];
  519.     
  520.     SetMyRegStr("", "ExePath", g_mydir);
  521.     
  522.     DelMyRegKey("DLL");
  523.     
  524.     GetMyRegStr(NULL, "Font", s, 80, "");
  525.     if(s[0] == 0)
  526.     {
  527.         HFONT hfont;
  528.         LOGFONT lf;
  529.         hfont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
  530.         if(hfont)
  531.         {
  532.             GetObject(hfont, sizeof(lf),(LPVOID)&lf);
  533.             SetMyRegStr("", "Font", lf.lfFaceName);
  534.         }
  535.     }
  536. }
  537.