- czy podczas wyłączania systemu program wykona operacje zapisania do pliku (testowałem to, jakoś nie wychodzi... )
Lepiej dopisać obsługę WM_QUERYENDSESSION lub WM_ENDSESSION. (zdaje się że WM_CLOSE może tu nie zadziałać).
Komunikat jest wysyłany do programu podczas kończenia pracy systemu .
Po odebraniu tego komunikatu można zapisać do pliku czas wyłączenia i zamknąć plik .
Ostatnio napisałem taki program ( ale pod C++ Builder) do kontroli czasu marnowego
na gry , gdy nie ma mnie w domu .
Zapisuje które konto było używane i sposób zamknięcia systemu w pliku w postaci :
System_start - 2008-01-17 18:17:24 - user- Tato
System_stop_ - 2008-01-17 18:23:37 - ENDSESSION.
System_start - 2008-01-17 19:02:03 - user- Tato
System_stop_ - 2008-01-17 19:21:09 - ENDSESSION.
System_start - 2008-01-17 19:26:16 - user- Dawid
System_stop_ - 2008-01-17 19:49:27 - ENDSESSION.
System_start - 2008-01-17 20:03:08 - user- Misiek
System_stop_ - 2008-01-17 20:18:08 - END -RESET.
Ps.
Aby uchwycić sposób zamknięcia systemu [ normalne lub reset ] program musi zapisywać
co pewien okres aktualny czas i datę , nadpisując ostatnią linijkę .
Mój robi to co 1 minutę za pomocą Timera [ czyli jeśli API to obsługa WM_TIMER ].
Jeśli będziesz zapisywał wyłącznie dane do pliku w czasie uruchamiania i zamykania
programu , to reset komputera może je zafałszować lub zniszczyć strukturę pliku .
Event , będzie brakować wpisu o zamknięciu systemu .
PS.
Twój kod jest nie kompletny i program nie działa , procedura WndProc nie wykonuje się .
Musisz ją powiązać z jakimś oknem [ może być niewidoczne ] .
CALLBACK <- WndProc procedura jest wywoływana po otrzymaniu komunikatu ( cyklicznie )
przez okno i kończy działanie , a więc wsztstkie obiekty lokalne w niej utworzone znikną [ ofstream f;]
trzeba użyć obiektu statycznego lub wskaźników dostępnych na zewnątrz WndProc na obiekty tworzone np w WM_CREATE , lub obiektów tworzonych w WinMain event Globalnych .
Uwaga 1 ostatni wpis w pliku C:\timelogs.txt jest zapisem czasu bieżącej sesji z założeniem -RESET
Uwaga 2 program nie tworzy widocznego okna .
/* timelog - dzejo - 4.02.2008 */
#include <windows.h>
#include <stdio.h>
#define ID_TIMER 1
HWND hwndMain;
HANDLE hFile ;
char UserName[50] ;
DWORD LenUserName = sizeof(UserName) ;
char TimeBuff[24] ;
char DateBuff[24] ;
char OutBuf[120] = {0} ;
char INFO_Session[] ={" - ENDSESSION "} ;
// Zakończono pracę na komputerze
char INFO_Reset[] ={" - END_RESET "} ;
// Wyłączenie - reset
char INFO_CloseApp[]={" - ENDAPPCLOSE"} ;
// Zamknięto aplikację managerem zadań [ Nie działa w NT ,only 98]
char INFO_SystemStart[]={"System_Start - "}; // start windows
char INFO_SystemStop[] ={"System_Stop_ - "}; // zatrzymanie
int LenOutBuf ;
LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
HANDLE OpenLogFile(LPCTSTR pFileName);
void WriteTimeStart(HANDLE file, LPTSTR buf ,LPTSTR date,LPTSTR time, LPTSTR user);
int WriteTimeStop(HANDLE file, LPTSTR buf ,LPTSTR date,LPTSTR time, LPTSTR status);
void GetDateTime(void);
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR /*lpszCmdLine*/, int /*nCmdShow*/)
{
MSG msg;
WNDCLASS wc;
CreateMutex(NULL, false, "2315757_ala_ma_kota");
if(GetLastError()>0)
{
MessageBox(NULL,"Aplikacja jest już uruchomiona.","Uwaga",MB_OK);
return FALSE ;
}
// Register the window class for the main window
if (!hPrevInstance)
{
wc.style = 0;
wc.lpfnWndProc = (WNDPROC) WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL ;
wc.hCursor = NULL ;
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = "MainWndClass";
if (!RegisterClass(&wc))
return FALSE;
}
// Create the main window.
hwndMain = CreateWindow("MainWndClass", "Timelog",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, (HWND) NULL,
(HMENU) NULL, hInstance, (LPVOID) NULL);
// If the main window cannot be created, terminate
// the application.
if (!hwndMain)
return FALSE;
// Okno nie będzie widoczne
/* ShowWindow(hwndMain, SW_SHOW );
UpdateWindow(hwndMain); */
hFile = OpenLogFile("C:\\timelogs.txt");
if(!hFile)
return FALSE ;
SetFilePointer(hFile,0,NULL,FILE_END); // idz na koniec pliku
GetUserName(UserName,&LenUserName); // pobierz nazwę uzytkownika
GetDateTime(); // pobierz czas i datę uruchonienia
// Zapisz do pliku czas i date uruchomienia
WriteTimeStart(hFile,OutBuf,DateBuff,TimeBuff,UserName);
// Zapisz do pliku czas i date zamknięcia
LenOutBuf = WriteTimeStop(hFile,OutBuf,DateBuff,TimeBuff,INFO_Reset);
// Uruchom Timer
SetTimer(hwndMain,ID_TIMER,30000,NULL); // 0,5 minuty
// Start the message loop.
while (GetMessage(&msg, (HWND) NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//--------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_TIMER:
GetDateTime();
SetFilePointer(hFile,-(LenOutBuf),NULL,FILE_END );
WriteTimeStop(hFile,OutBuf,DateBuff,TimeBuff,INFO_Reset);
return 0 ;
case WM_CLOSE:
KillTimer(hwnd,ID_TIMER);
GetDateTime();
SetFilePointer(hFile,-(LenOutBuf),NULL,FILE_END );
WriteTimeStop(hFile,OutBuf,DateBuff,TimeBuff,INFO_CloseApp);
CloseHandle(hFile);
break ;
case WM_QUERYENDSESSION: //<- lub WM_ENDSESSION
KillTimer(hwnd,ID_TIMER);
GetDateTime();
SetFilePointer(hFile,-(LenOutBuf),NULL,FILE_END );
WriteTimeStop(hFile,OutBuf,DateBuff,TimeBuff,INFO_Session);
CloseHandle(hFile);
break ; //<- lub return 0 ; jeśli WM_ENDSESSION
case WM_DESTROY:
PostQuitMessage(0); /* zakończ program */
return 0;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
//-----------------------------------------------------------------------------
HANDLE OpenLogFile(LPCTSTR pFileName)
{
HANDLE pFile ;
pFile = CreateFile(pFileName,GENERIC_WRITE,
FILE_SHARE_READ,NULL,OPEN_ALWAYS ,
FILE_ATTRIBUTE_NORMAL ,NULL);
if(INVALID_HANDLE_VALUE == pFile)
{
MessageBox(NULL, "Error","Nie można otworzyć pliku.",MB_OK);
return NULL;
}
return pFile ;
}
//-----------------------------------------------------------------------------
void WriteTimeStart(HANDLE file, LPTSTR Out ,LPTSTR date,LPTSTR time,LPTSTR user )
{
DWORD len ;
sprintf(Out,"\r\n%s %s %s %s\r\n",INFO_SystemStart,date,time,user);
WriteFile(file,Out,lstrlen(Out),&len,NULL);
}
//-----------------------------------------------------------------------------
int WriteTimeStop(HANDLE file, LPTSTR Out ,LPTSTR date,LPTSTR time, LPTSTR status)
{
DWORD len ;
sprintf(Out,"%s %s %s %s\r\n",INFO_SystemStop,date,time,status);
WriteFile(file,Out,lstrlen(Out),&len,NULL);
return lstrlen(Out);
}
//----------------------------------------------------------------------------
void GetDateTime(void)
{
GetDateFormat(LOCALE_SYSTEM_DEFAULT,0,
NULL,"dd'-'MM'-'yyyy",DateBuff,sizeof(DateBuff));
GetTimeFormat(LOCALE_SYSTEM_DEFAULT ,TIME_FORCE24HOURFORMAT,
NULL,"HH':'mm':'ss ",TimeBuff,sizeof(TimeBuff));
}
A,masz - przeróbka z Buildera VCL na API .