p align="left">wcl. hInstance=hInstance; // дескриптор экземпляра окна // дескриптор пиктограммы wcl. hIcon=LoadIcon (NULL, IDI_APPLICATION); wcl. hCursor=LoadCursor (NULL, IDC_ARROW); // дескриптор курсора wcl. hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH);); // цвет фона wcl. lpszMenuName=NULL; // имя ресурса с главным меню программы // ресурс меню, связанный с окном wcl. lpszClassName="Pass"; // имя класса окна if (! RegisterClass (&wcl)) return 0; hWnd=CreateWindow (wcl. lpszClassName,"window",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow (hWnd,SW_HIDE); UpdateWindow (hWnd); while (GetMessage (&lpMsg, NULL, 0,0)) { TranslateMessage (&lpMsg); DispatchMessage (&lpMsg); } return lpMsg. wParam; } LRESULT CALLBACK WindowProc (HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) // дескриптор окна { static HINSTANCE hInstance; switch (message) { case WM_CREATE: { hInstance = ( (LPCREATESTRUCT) lParam) - >hInstance; DialogBox (hInstance, IDD_DIAL,hWnd, MyDlgProc); break; } case WM_DESTROY: { PostQuitMessage (0); break; } default: return DefWindowProc (hWnd, message, wParam, lParam); } return 0; } INT CALLBACK MyDlgProc (HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) { static SHEDULEDATA sd [30] ; static int count,nextexe,delayexe; static char name [300] ; char * n; static BOOL frst, fileopen = FALSE,filewasopened=FALSE; BOOL cp; char tip [] ="запуск по расписанию\0"; UINT uId=111; static NOTIFYICONDATA nfd; int i; static STARTUPINFO si; static HANDLE hMenu,hTimer,hFile; static PROCESS_INFORMATION pi; switch (uMsg) { case WM_INITDIALOG: si. cb=sizeof (STARTUPINFO); GetStartupInfo (&si); nfd. cbSize=sizeof (NOTIFYICONDATA); nfd. hWnd=hDlg; nfd. uID=uId; nfd. uFlags=NIF_MESSAGE case WM_CLOSE: { if (filewasopened) CloseHandle (hFile); Shell_NotifyIcon (NIM_DELETE,&nfd); DestroyMenu (hMenu); SendMessage (GetParent (hDlg),WM_DESTROY,0,0); EndDialog (hDlg, 0); return (TRUE); } case WM_SIZE: { if (wParam==SIZE_MINIMIZED) { ShowWindow (hDlg,SW_HIDE); Shell_NotifyIcon (NIM_ADD,&nfd); } return TRUE; } case WM_TIMER: { cp=CreateProcess (sd [nextexe]. fname,NULL,NULL,FALSE,CREATE_DEFAULT_ERROR_MODE,NULL,NULL,NULL,&si,&pi); KillTimer (hDlg,TM); if (! cp) MB_ICONERROR) ==IDNO) SendMessage (hDlg,WM_COMMAND, IDC_STOP,0); else SendMessage (hDlg,WM_COMMAND, IDC_START,0); else { nextexe=FindNext (sd,count); if (nextexe<0) { SendMessage (hDlg,WM_COMMAND, IDC_STOP,0); return TRUE; } delayexe=sd [nextexe]. delay; sd [nextexe]. delay=-1; SubtDelay (sd,count,delayexe); if (! SetTimer (hDlg,TM,1000*delayexe,NULL)) frst=TRUE; if (MessageBox (hDlg,"В системе нет свободных таймеров. ",0,MB_RETRYCANCEL } return TRUE; } case WM_SHELLNOTIFY: { POINT pn; if (wParam==uId) { if (lParam==WM_RBUTTONDOWN) { GetCursorPos (&pn); SetForegroundWindow (hDlg); TrackPopupMenu (hMenu,TPM_RIGHTALIGN,pn. x,pn. y,0,hDlg,NULL); PostMessage (hDlg,WM_NULL,0,0); } else if (lParam==WM_LBUTTONDOWN) SendMessage (hDlg,WM_COMMAND, IDC_RESTORE,0); } return TRUE; } case WM_COMMAND: switch (LOWORD (wParam)) { case IDC_EXIT: { if (filewasopened) CloseHandle (hFile); Shell_NotifyIcon (NIM_DELETE,&nfd); DestroyMenu (hMenu); SendMessage (GetParent (hDlg),WM_DESTROY,0,0); EndDialog (hDlg,0); return TRUE; } case IDC_OPEN: { n=FileOpen (hDlg); if (n! =0) { lstrcpy (name,n); fileopen=TRUE; SetDlgItemText (hDlg, IDC_TEXT,name); } return TRUE; } case IDC_START: { if (frst) { if (! fileopen) { i=GetDlgItemText (hDlg, IDC_TEXT,name,120); if (i==0) { MessageBox (hDlg,"введите имя файла с расписанием","ожидается ввод",MB_OK); return TRUE; } } if ( (hFile=CreateFile (name,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)) ==INVALID_HANDLE_VALUE) MessageBox (0,"Не удается открыть файл с расписанием","error",MB_APPLMODAL|MB_OK|MB_ICONSTOP); filewasopened=FALSE; return TRUE; } filewasopened=TRUE; count=ReadShedule (hFile,sd); if (count <=0) MessageBox (hDlg,"Файл не соответствует формату",NULL,MB_OK CloseHandle (hFile); MakeItStandart (sd,count); filewasopened=frst=FALSE; } nextexe=FindNext (sd,count); if (nextexe<0) { SendMessage (hDlg,WM_COMMAND, IDC_STOP,0); return TRUE; } delayexe=sd [nextexe]. delay; sd [nextexe]. delay=-1; SubtDelay (sd,count,delayexe); SendMessage (hDlg,WM_SIZE,SIZE_MINIMIZED,0); if (! SetTimer (hDlg,TM,1000*delayexe,NULL)) MB_ICONERROR) ==IDRETRY) SendMessage (hDlg,WM_COMMAND, IDC_START,0); else SendMessage (hDlg,WM_COMMAND, IDC_STOP,0); return TRUE; } case IDC_STOP: { if (! frst) KillTimer (hDlg,TM); count =0; nextexe=-1; frst=TRUE; MessageBox (hDlg,"в расписании больше нет задач","Завершение",MB_OK return TRUE; } case IDC_RESTORE: { Shell_NotifyIcon (NIM_DELETE,&nfd); ShowWindow (hDlg,SW_RESTORE); SetForegroundWindow (hDlg); return TRUE; } } return TRUE; } return FALSE; } char * FileOpen (HWND hWnd) OFN_FILEMUSTEXIST; if (GetOpenFileName (&filename) ! = NULL) return (filename. lpstrFile); else return 0; int ReadShedule (HANDLE hFile,SHEDULEDATA sd [30]) { char str [200] =""; char symb; char buff [2] =""; int w; BOOL IsComm; int numb; int i; int j; for (i=0; i<30; i++) { j=-1; w=0; while (1) { ReadFile (hFile,&symb,1,&numb,NULL); if (numb==0) return i+1; if (symb=='\\') symb='/'; if ( (j==-1) && (symb! ='"')) return - 1; else if (j==-1) { IsComm=TRUE; j++; continue; } else if (IsComm) if (symb=='"') { IsComm=FALSE; sd [i]. fname [j] =0; j=0; continue; } else { sd [i]. fname [j] =symb; j++; continue; } else if ( (symb==0xd) || (symb==' ') || (symb==': ')) continue; if ( (symb! =0xa)) { if (j>5) return - 1; sd [i]. tname [j] =symb; j++; continue; } else break; } } return i+1; } void cstrcpy (char *a,char *b, int from, int count) { int i; int j=0; for (i=from; i<from+count; i++) { b [j] =a [i] ; j++; } } void MakeItStandart (SHEDULEDATA sd [30], int count) { int i; SYSTEMTIME st; char buffer [2] ; int uis; int uil; int ui; GetLocalTime (&st); for (i=0; i<count; i++) { cstrcpy (sd [i]. tname,buffer,0,2); sd [i]. h=atoi (buffer); cstrcpy (sd [i]. tname,buffer,2,2); sd [i]. m=atoi (buffer); cstrcpy (sd [i]. tname,buffer,4,2); sd [i]. s=atoi (buffer); uil=sd [i]. h*3600+sd [i]. m*60+sd [i]. s; uis=st. wHour*3600+st. wMinute*60+st. wSecond; ui=uil-uis; if (ui<0) sd [i]. delay=ui+24*3600; else sd [i]. delay=ui; } } int FindNext (SHEDULEDATA sd [30], int count) { int i,min=0xFFFFFFF; int minnumber=-1; for (i=0; i<count; i++) { if (sd [i]. delay<0) continue; else if (sd [i]. delay<min) { min=sd [i]. delay; minnumber=i; } } return minnumber; } void SubtDelay (SHEDULEDATA sd [30], int count, int delay) { int i; for (i=0; i<count; i++) if (sd [i]. delay>=0) sd [i]. delay-=delay; }
Страницы: 1, 2, 3
|