View Full Version : [c++] modificare l'ora
bouncey2k
18-01-2006, 13:15
Ciao a tutti! Vorrei sapere come è possibile modificare l'ora che compare nella barra di windows, sostituendovi per esempio una scritta. So che questi dati vengono modificati in (ditemi se sbaglio) HKEY_CURRET_USER > Control Panel > International nei file
- s1159
- s2359
- sTimeFormat
- TimeFormat
grazie. ciao.
bouncey2k
19-01-2006, 13:48
up... :mc:
Ciao, che io sappia, nella chiave che hai detto, il valore s1159 indica il testo da aggiungere per l'ora "AM", il valore s2359 indica il testo da aggiungere per l'ora "PM" e il valore sTimeFormat indica appunto il formato completo dell'ora.
Puoi senz'altro modificare questi valori, mettendo ad esempio in sTimeFormat la stringa "Ciao" per avere questa stringa al posto dell'orologio.
Ma tieni presente che questa è una impostazione globale per l'utente e quindi va ad influire anche su tutte le altre applicazioni che usano le funzioni di formattazione dell'ora!!! Quindi sei avvisato ... ;)
bouncey2k
20-01-2006, 12:43
Ciao, che io sappia, nella chiave che hai detto, il valore s1159 indica il testo da aggiungere per l'ora "AM", il valore s2359 indica il testo da aggiungere per l'ora "PM" e il valore sTimeFormat indica appunto il formato completo dell'ora.
Puoi senz'altro modificare questi valori, mettendo ad esempio in sTimeFormat la stringa "Ciao" per avere questa stringa al posto dell'orologio.
Ma tieni presente che questa è una impostazione globale per l'utente e quindi va ad influire anche su tutte le altre applicazioni che usano le funzioni di formattazione dell'ora!!! Quindi sei avvisato ... ;)
ho capito.. al livello pratico (in c++) come posso fare? qualche dritta?
PS: ho le basi del c++.
ho capito.. al livello pratico (in c++) come posso fare? qualche dritta?
PS: ho le basi del c++.
Se proprio devi scrivere in quei valori ... io so farlo usando le API Win32. Ecco un esempio (non l'ho testato ma comunque dovrebbe funzionare):
LONG lRet;
HKEY hKey;
CHAR szFormat[] = "Ciao";
lRet = RegOpenKeyEx (HKEY_CURRENT_USER, "Control Panel\\International",
0, KEY_WRITE, &hKey);
if (lRet == ERROR_SUCCESS)
{
lRet = RegSetValueEx (hKey, "sTimeFormat", 0, REG_SZ, (const BYTE*) szFormat, lstrlen (szFormat) + 1);
if (lRet == ERROR_SUCCESS)
{
/* Successo */
}
RegCloseKey (hKey);
}
bouncey2k
20-01-2006, 13:20
ma quel codice non va inserito in un contesto? :confused:
ma quel codice non va inserito in un contesto? :confused:Scusa ... cosa intendi per contesto??
bouncey2k
22-01-2006, 01:12
Scusa ... cosa intendi per contesto??
che compilato solamente in quel modo non funziona.. :confused:
che compilato solamente in quel modo non funziona.. :confused:Beh, ovvio! Il blocco di codice che ho postato va messo, naturalmente, all'interno di una funzione. Ma io non so come vuoi fare questa applicazione, cioè se vuoi creare una applicazione Win32 console, Win32 gui, ecc... e quindi ho solo postato il blocco di codice utile e basta.
Se vuoi fare una applicazione Win32 console, il codice completo sarebbe, ad esempio:
#define STRICT
#include <windows.h>
#include <stdio.h>
int main (int argc, char *argv[])
{
LONG lRet;
HKEY hKey;
CHAR szFormat[] = "Ciao";
lRet = RegOpenKeyEx (HKEY_CURRENT_USER, "Control Panel\\International",
0, KEY_WRITE, &hKey);
if (lRet == ERROR_SUCCESS)
{
lRet = RegSetValueEx (hKey, "sTimeFormat", 0, REG_SZ, (const BYTE*) szFormat, lstrlen (szFormat) + 1);
if (lRet == ERROR_SUCCESS)
printf ("Scrittura valore avvenuta correttamente!\n");
else
printf ("Scrittura valore fallita!\n");
RegCloseKey (hKey);
}
else
printf ("Errore nella apertura della chiave!\n");
return 0;
}
bouncey2k
25-01-2006, 09:54
grazie, sei stato molto utile.
mi chiedevo però una cosa. Con quel codice l'ora viene cambiata solo al riavvio. E' possibile farla cambiare appena eseguito l'exe? :mbe:
EDIT: il codice mi permette di immettere solo 4 caratteri? come posso aumentarli?
EDIT_2: altra cosa bizzarra.. se scrivo "CIAO" me lo legge.. se scrivo "HOLA" mi compare "11OLA".. 11 perché sono le 11 e qualcosa.. ma perché fa così se i caratteri sono sempre 4? :confused:
grazie, sei stato molto utile.Prego! :)
mi chiedevo però una cosa. Con quel codice l'ora viene cambiata solo al riavvio. E' possibile farla cambiare appena eseguito l'exe? :mbe:Sì, in effetti modificare quei valori del registro non causa l'applicazione immediata delle modifiche alle altre applicazioni.
La soluzione comunque c'è! Inviare il messaggio WM_SETTINGCHANGE in broadcast a tutte le applicazioni con questo codice:
DWORD dwRetval;
...
...
SendMessageTimeout (HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM) "intl", SMTO_ABORTIFHUNG, 10000, &dwRetval);
dwRetval lo puoi ignorare. Se vuoi puoi testare eventualmente cosa ti ritorna la SendMessageTimeout (restituisce un LRESULT che se è != 0 indica successo altrimenti errore).
EDIT: il codice mi permette di immettere solo 4 caratteri? come posso aumentarli?Dal momento che ho dichiarato la stringa come CHAR szFormat[] e che alla RegSetValueEx passo lstrlen (szFormat) + 1, puoi mettere la stringa della lunghezza che vuoi.
EDIT_2: altra cosa bizzarra.. se scrivo "CIAO" me lo legge.. se scrivo "HOLA" mi compare "11OLA".. 11 perché sono le 11 e qualcosa.. ma perché fa così se i caratteri sono sempre 4? :confused:Non è un errore! Succede perché il valore in "sTimeFormat" indica un formato ed alcune lettere sono "speciali". Esempio: "h" per l'ora (12 ore), "H" per l'ora (24 ore), "m" per i minuti, ecc...
Una soluzione potrebbe essere quella di mettere in "sTimeFormat" la stringa "tt" che indica di mettere il "time marker" cioè la dicitura relativa ad AM/PM ed impostare entrambi i valori "s1159" e "s2359" alla stringa che vuoi tu.
Nota finale: oltre a scrivere in quei valori del registro, si possono cambiare le impostazioni del locale con la funzione SetLocaleInfo, che è il modo "pulito" di accedere a queste informazioni. L'accesso al registro (che è quello che fa poi la SetLocaleInfo) è comunque fattibile.
bouncey2k
25-01-2006, 12:05
1) mettendo il codice
DWORD dwRetval;
...
...
SendMessageTimeout (HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM) "intl", SMTO_ABORTIFHUNG, 10000, &dwRetval);
funziona solo se lancio l'eseguibile 2 volte.. la prima volta non accade nulla.
2) Non ho capito bene ancora una cosa sui caratteri.. Il massimo di caratteri che posso usare arrivare sulla 30ina circa..
3) "Una soluzione potrebbe essere quella di mettere in "sTimeFormat" la stringa "tt" che indica di mettere il "time marker" cioè la dicitura relativa ad AM/PM ed impostare entrambi i valori "s1159" e "s2359" alla stringa che vuoi tu." .. in che modo?
1) mettendo il codice
DWORD dwRetval;
...
...
SendMessageTimeout (HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM) "intl", SMTO_ABORTIFHUNG, 10000, &dwRetval);
funziona solo se lancio l'eseguibile 2 volte.. la prima volta non accade nulla.Uhm ... molto strano, a me funziona benissimo.
2) Non ho capito bene ancora una cosa sui caratteri.. Il massimo di caratteri che posso usare arrivare sulla 30ina circa..
3) "Una soluzione potrebbe essere quella di mettere in "sTimeFormat" la stringa "tt" che indica di mettere il "time marker" cioè la dicitura relativa ad AM/PM ed impostare entrambi i valori "s1159" e "s2359" alla stringa che vuoi tu." .. in che modo?
Allora ... ho fatto alcune prove, giusto anche per capire meglio io. Nel post precedente ti avevo detto che si può usare la SetLocaleInfo per impostare le informazioni sul locale. Questo è vero, ma la SetLocaleInfo fa parecchi controlli per stabilire se un valore è valido o meno. Il seguente codice:
SetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_STIMEFORMAT, "tt");fallisce di brutto con errore ERROR_INVALID_PARAMETER perché (deduco io) secondo la funzione è sbagliato impostare solo il "time marker" senza alcun formato dell'ora prima!!!!
Quindi "cancella" quanto ti ho detto sulla SetLocaleInfo. ;)
Per quello che vuoi fare tu, devi per forza scrivere direttamente nel registry. Ecco il codice:
#define STRICT
#include <windows.h>
#include <stdio.h>
int main (void)
{
LONG lRet;
HKEY hKey;
DWORD dwRetval;
CHAR szFormat[] = "tt";
CHAR szText[] = "Hello da Andrea";
lRet = RegOpenKeyEx (HKEY_CURRENT_USER, "Control Panel\\International",
0, KEY_WRITE, &hKey);
if (lRet == ERROR_SUCCESS)
{
lRet = RegSetValueEx (hKey, "sTimeFormat", 0, REG_SZ, (const BYTE*) szFormat, lstrlen (szFormat) + 1);
printf ("Scrittura valore sTimeFormat: %s\n", lRet == ERROR_SUCCESS ? "OK" : "Errore");
lRet = RegSetValueEx (hKey, "s1159", 0, REG_SZ, (const BYTE*) szText, lstrlen (szText) + 1);
printf ("Scrittura valore s1159: %s\n", lRet == ERROR_SUCCESS ? "OK" : "Errore");
lRet = RegSetValueEx (hKey, "s2359", 0, REG_SZ, (const BYTE*) szText, lstrlen (szText) + 1);
printf ("Scrittura valore s2359: %s\n", lRet == ERROR_SUCCESS ? "OK" : "Errore");
RegCloseKey (hKey);
SendMessageTimeout (HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM) "intl", SMTO_ABORTIFHUNG, 10000, &dwRetval);
}
else
printf ("Errore nella apertura della chiave!\n");
return 0;
}
http://img87.imageshack.us/img87/6130/helloclock4cv.gif
In effetti anche io ho notato un limite nella lunghezza della stringa. Nella barra di Windows riesco a far visualizzare un massimo di 36 caratteri. Penso che non si possa fare nulla per superare questo limite. Presumo che sia un limite di Explorer o delle funzioni di formattazione della data/ora.
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.