View Full Version : [C] Impostare lo sfondo
Fenomeno85
04-11-2004, 15:49
Gente qualcuno sa come faccio in c a impostare uno sfondo del desktop?? Che cosa devo richiamare??
~§~ Sempre E Solo Lei ~§~
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/systemparametersinfo.asp
;)
Fenomeno85
05-11-2004, 19:51
sempre il migliore grazie :D
~§~ Sempre E Solo Lei ~§~
Fenomeno85
06-11-2004, 10:31
porca paletta ma perchè vuole funzionare solo con i file bmp e i jpg no :muro:
~§~ Sempre E Solo Lei ~§~
Perchè credo che con i file JPG tu debba usare ActiveDektop...
Fenomeno85
06-11-2004, 15:56
hai qualche link?
~§~ Sempre E Solo Lei ~§~
La cosa diventa più complicata...
void SetWallpaper(char* sString)
{
HRESULT hr;
IActiveDesktop *pActiveDesktop;
char sPath[MAX_PATH];
WCHAR wsPath[MAX_PATH];
CoInitialize(NULL);
hr = CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER, IID_IActiveDesktop, (void**)&pActiveDesktop);
if(SUCCEEDED(hr))
{
COMPONENTSOPT copt;
ZeroMemory(&copt, sizeof(copt));
copt.dwSize = sizeof(COMPONENTSOPT);
copt.fEnableComponents = TRUE;
copt.fActiveDesktop = TRUE;
hr = pActiveDesktop->SetDesktopItemOptions(&copt, 0);
if(SUCCEEDED(hr))
{
strcpy(sPath, sString);
MultiByteToWideChar(CP_ACP, 0, sPath, -1, wsPath, MAX_PATH);
pActiveDesktop->SetWallpaper(wsPath,0);
pActiveDesktop->ApplyChanges(AD_APPLY_ALL);
}
pActiveDesktop->Release();
}
CoUninitialize();
}
Fenomeno85
06-11-2004, 17:44
non si compila dice che devo dichiarare IActiveDesktop
domanda: ma c'è qualche modo di convertire le immagine con qualche funzione in bmp?
~§~ Sempre E Solo Lei ~§~
Originariamente inviato da Fenomeno85
non si compila dice che devo dichiarare IActiveDesktop
Ovvio... Ricordati che c'è anche MSDN ;)
http://support.microsoft.com/default.aspx?scid=kb;en-us;237413
Funziona perfettamente...
Ovviamente questo non è C, ma C++...
#include <windows.h>
#include <wininet.h>
#include <shlobj.h>
void SetWallpaper(char* sString)
{
HRESULT hr;
IActiveDesktop *pActiveDesktop;
char sPath[MAX_PATH];
WCHAR wsPath[MAX_PATH];
CoInitialize(NULL);
hr = CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER, IID_IActiveDesktop, (void**)&pActiveDesktop);
if(SUCCEEDED(hr))
{
COMPONENTSOPT copt;
ZeroMemory(&copt, sizeof(copt));
copt.dwSize = sizeof(COMPONENTSOPT);
copt.fEnableComponents = TRUE;
copt.fActiveDesktop = TRUE;
hr = pActiveDesktop->SetDesktopItemOptions(&copt, 0);
if(SUCCEEDED(hr))
{
strcpy(sPath, sString);
MultiByteToWideChar(CP_ACP, 0, sPath, -1, wsPath, MAX_PATH);
pActiveDesktop->SetWallpaper(wsPath,0);
pActiveDesktop->ApplyChanges(AD_APPLY_ALL);
}
pActiveDesktop->Release();
}
CoUninitialize();
}
int main(int argc, char *argv[])
{
SetWallpaper("immagine.jpg");
return 0;
}
Fenomeno85
06-11-2004, 19:15
grazies :) adesso provo :) ... cmq io per fare un parser di una cartella uso la chiamata parser (dir>.......);
funziona tutto ma secondo te è il miglior modo?
~§~ Sempre E Solo Lei ~§~
Fenomeno85
06-11-2004, 19:21
non me lo compila ...sempre stesso problema ... con devc++ :muro:
~§~ Sempre E Solo Lei ~§~
Con Visual C++ funziona perfettamente...
Fenomeno85
07-11-2004, 09:34
ho visto che per funzionare ci deve essere shell32.dll ... sai come posso vedere se in devc++ è già inserita?
~§~ Sempre E Solo Lei ~§~
Per libshell32.a non ci sono problemi...basta linkarla...ma non da errori in fase di linking...
Il problema è che molte di quelle strutture, funzioni ed oggetti non sono definite all'interno di shlobj.h e in nessun altro header...
Credo che le API Win32 di MinGW32 non supportino ancora a pieno i COM objects...
Fenomeno85
07-11-2004, 09:53
va be ho capito che disinstallo dev e mi rimetto Visual Studio :(
~§~ Sempre E Solo Lei ~§~
Fenomeno85
07-11-2004, 10:01
comunque cionci per fare un elenco dei file di una cartella, io ho pensato di usare la chiamata system ... secondo va bene o ce ne è una migliore?
~§~ Sempre E Solo Lei ~§~
No...fare così è assurdo... Puoi usare o le chiamate alla libreria del C (anche se non standard)...o le API...
/* FFIND.C: This program uses the 32-bit _find functions to print
* a list of all files (and their attributes) with a .C extension
* in the current directory.
*/
#include <stdio.h>
#include <io.h>
#include <time.h>
void main( void )
{
struct _finddata_t c_file;
long hFile;
/* Find first .c file in current directory */
if( (hFile = _findfirst( "*.c", &c_file )) == -1L )
printf( "No *.c files in current directory!\n" );
else
{
printf( "Listing of .c files\n\n" );
printf( "\nRDO HID SYS ARC FILE DATE %25c SIZE\n", ' ' );
printf( "--- --- --- --- ---- ---- %25c ----\n", ' ' );
printf( ( c_file.attrib & _A_RDONLY ) ? " Y " : " N " );
printf( ( c_file.attrib & _A_SYSTEM ) ? " Y " : " N " );
printf( ( c_file.attrib & _A_HIDDEN ) ? " Y " : " N " );
printf( ( c_file.attrib & _A_ARCH ) ? " Y " : " N " );
printf( " %-12s %.24s %9ld\n",
c_file.name, ctime( &( c_file.time_write ) ), c_file.size );
/* Find the rest of the .c files */
while( _findnext( hFile, &c_file ) == 0 )
{
printf( ( c_file.attrib & _A_RDONLY ) ? " Y " : " N " );
printf( ( c_file.attrib & _A_SYSTEM ) ? " Y " : " N " );
printf( ( c_file.attrib & _A_HIDDEN ) ? " Y " : " N " );
printf( ( c_file.attrib & _A_ARCH ) ? " Y " : " N " );
printf( " %-12s %.24s %9ld\n",
c_file.name, ctime( &( c_file.time_write ) ), c_file.size );
}
_findclose( hFile );
}
}
Fenomeno85
07-11-2004, 12:59
ottimo son riuscito a fare tutto!!!! :D adesso ad ogni accensione avrò uno screen sempre diverso!!! :D
cionci per curiosità sai come posso mettere che a un tempo che stabilisco io venga eseguito un programma?
per intenderci: ogni 3 secondi il progrmma deve essere rieseguito :)
~§~ Sempre E Solo Lei ~§~
Certo....
UINT_PTR SetTimer(
HWND hWnd, // handle to window
UINT_PTR nIDEvent, // timer identifier
UINT uElapse, // time-out value
TIMERPROC lpTimerFunc // timer procedure
);
TIMERPROC ha questo formato:
VOID CALLBACK TimerProc(
HWND hwnd, // handle to window
UINT uMsg, // WM_TIMER message
UINT_PTR idEvent, // timer identifier
DWORD dwTime // current system time
);
Fenomeno85
30-11-2004, 19:19
sto provando a farlo in modo visuale utilizzando borland 6 :(
ma porca paletta nel codice per settare lo sfondo mi da sempre sta roba:
[C++ Error] shobjidl.h(2193): E2238 Multiple declaration for 'FOLDERSETTINGS'
[C++ Error] shobjidl.h(8095): E2238 Multiple declaration for 'DESKBANDINFO'
[C++ Error] shlobj.h(1422): E2238 Multiple declaration for 'FVSHOWINFO'
[C++ Error] shlobj.h(3457): E2238 Multiple declaration for 'SHELLFLAGSTATE'
[C++ Error] Unit1.cpp(23): E2015 Ambiguity between 'CLSID_ActiveDesktop' and 'Shlobj::CLSID_ActiveDesktop'
perchè :muro:
~§~ Sempre E Solo Lei ~§~
Io l'ho compilato con Visual C++ e non ho avuto alcun problema...
Fenomeno85
30-11-2004, 19:46
Originariamente inviato da cionci
Io l'ho compilato con Visual C++ e non ho avuto alcun problema...
si anchio avevo utilizzato vc e funzionava però solo sotto forma di programma versione testo, invece vorrei provare a farlo con anche la visuale ma questo mi crea problemi e non capisco il motivo :muro:
~§~ Sempre E Solo Lei ~§~
Fenomeno85
30-11-2004, 20:01
porca paletta ho capito che cos'è :muro: quando si crea una applicazione borland include la libreria vlc.h e questa stronza ha già dichiarato un pezzo di shlobj.h :mbe:
Quindi escludo quella libreria e fa la compilazione ... ma quando esegue sto stronzo non fa niente si vede il desk che fa il refresh ma non cambia sto sfondo :muro:
questo è il bottone :wtf:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
SetWallpaper("C:\Colline_azzurre.jpg");
}
~§~ Sempre E Solo Lei ~§~
C'è il doppio \ nel percorso ?
Fenomeno85
30-11-2004, 20:11
Originariamente inviato da cionci
C'è il doppio \ nel percorso ?
maledizione mi son dimenticato infatti funziona :muro: ma posso essere così scemo :muro:
~§~ Sempre E Solo Lei ~§~
Fenomeno85
30-11-2004, 20:21
cionci hai la comparazione dei comandi da VB a VC tipo:
msgbox -> MessageBox
mi servirebbe quello esempio di chiusura di un form :)
~§~ Sempre E Solo Lei ~§~
C'è l'help del Borland per trovare queste cose...vai sull'oggetto form e vedi tutti i metodi...
Fenomeno85
30-11-2004, 20:24
Originariamente inviato da cionci
C'è l'help del Borland per trovare queste cose...vai sull'oggetto form e vedi tutti i metodi...
thanks :)
~§~ Sempre E Solo Lei ~§~
Fenomeno85
30-11-2004, 20:49
non li trovo :wtf:
~§~ Sempre E Solo Lei ~§~
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.