IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

[C/C++]Rafraichir le bureau (plus précisément le fond d'écran)


Sujet :

Windows

  1. #1
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut [C/C++]Rafraichir le bureau (plus précisément le fond d'écran)
    Bonjour @ Tous !

    Voilà, j'ai fait (juste pour le fun, je sais ça existe déjà ) un petit programme qui me change le fond d'écran automatiquement toutes les N minutes...

    ils marche très bien, à cela qu'il me faut faire un F5 sur le bureau pour voir le fond d'écran changer...

    j'aimerais savoir comment je peux faire pour que ce soit fait automatiquement...

    j'ai cherché des infos via google, mais je n'ai rien trouvé de vraiment concluant...

    Merci d'Avance !
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  2. #2
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Je suppose que tu passes par SystemParamterInfo, as-tu essayé d'envoyer SPIF_SENDCHANGE dans le param fWinIni ?

    fWinIni
    [in] If a system parameter is being set, specifies whether the user profile is to be updated, and if so, whether the WM_SETTINGCHANGE message is to be broadcast to all top-level windows to notify them of the change.
    This parameter can be zero if you don't want to update the user profile or broadcast the WM_SETTINGCHANGE message, or it can be one or more of the following values.


    Sinon tu peux toujours redessinner le desktop avec un UpdateWindow() ou un RedrawWindow() ...

  3. #3
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    heu...

    tu pourrais être un peu plus précis ? c'est la première fois que j'utilise l'API Windows, et je suis absoluement pas familié avec les différentes fonctions
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  4. #4
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Désolé pour le raccourci...

    Je supposais que tu utilisais l'API SysParameterInfo() qui permet notamment de changer le WallPaper du desktop, il est possible que tu ais utilisé une autre possibilité. Il me semble que cette API redessine le desktop d'elle-même.

    Dans tous les cas tu peux tenter d'utiliser les APIs UpdateWindow() ou RedrawWindow() pour mettre à jour le desktop. Pur ces APIs tu aura besoin du HWND du desktop, pour cela tu peux le retrouver avec FindWindow().

    J'epsère que c'est un peu plus clair

  5. #5
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Merci beaucoup pour ces infos, non, je n'utilise pas SysParameterInfo, j'ai simplement pris un fichier dans lequel je copie directement le contenu du Wall à afficher (je me suis aperçu en testant différents logiciels qui le faisaient déjà justement que le changement automatique via la BdR pouvait causer des bugs d'affichage, contrairement à cette méthode )

    je vais me renseigner dans la MSDN pour trouver ces fonction

    Je tiens au courant ici et mets le résolu dès que j'ai trouvé une solution fonctionnelle
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  6. #6
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    j'ai essayé beaucoup de chose (Progrman éventuellement ses fils et petits fils pour trouver le bon handle de windows, Desktop aussi) et en desespoire de compte, le SysParameterInfo (en précisant le chemin du nouveau fond d'écran ou en faisant la copie et en fais une mise à jour sans changer le fond d'écran)

    mais rien à faire, soit il ne recharge pas le fichier (SPI me retourne 1 [donc OK]), soit il me dit que le fichier existe déjà (erreur 183 : bah oui, logique...) ou d'autre erreur à la c**


    Je desespère... j'ai tout testé je pense...

    je viens de refaire un test avec SPI, le me renvoie 0, sauf que GetLastError() me renvoie 0 aussi et en prime il me fait sauter le fond d'écran... j'comprends plus là...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Si tu n'as pas peur d'utiliser COM, tu peux essayer avec une IActiveDesktop...

    voici un code à moi (je ne sais plus pourquoi j'avais mis la gestion des erreurs en commentaire, mais si ça ne marche pas tu peux la réactiver)
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    //Attention, ce code utilise un objet COM en C.
    //Il ne compilera pas en C++
     
    //_WIN32_IE doit être supérieur ou égal à 0x0400
    #include <windows.h>
    #include <wininet.h>
    #include <shlobj.h>
     
    BOOL reglerArrierePlan(LPWSTR cheminW, DWORD styleAR, BOOL bUtiliserStyle)
    {
    	IActiveDesktop *pt_desk;
    	HRESULT hr;
    	BOOL retour=FALSE;
     
    	CoInitialize(NULL);
    	//Récupère Active desktiop avec l'Appel décrit sur
    	//http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/programmersguide/shell_adv/activedesktop.asp#accessing_the_active_desktop
    	hr=CoCreateInstance(&CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER, &IID_IActiveDesktop, (void**)&pt_desk);
    	switch(hr)
    	{
    	case S_OK:
    		hr=pt_desk->lpVtbl->SetWallpaper(pt_desk, cheminW,0);
    		if(hr==S_OK)
    		{
    			if(bUtiliserStyle)
    			{
    				WALLPAPEROPT wpo;
    				wpo.dwSize=sizeof(WALLPAPEROPT);
    				wpo.dwStyle=styleAR;
    				pt_desk->lpVtbl->SetWallpaperOptions(pt_desk, &wpo,0);
    			}
    			//puts("Réglage OK");
    			pt_desk->lpVtbl->ApplyChanges(pt_desk, AD_APPLY_ALL);
    			retour=TRUE;
    		}
    		//else
    			//puts("Echec du R‚glage");
    		pt_desk->lpVtbl->Release(pt_desk);
    		break;
    	case REGDB_E_CLASSNOTREG:
    		//puts("Erreur REGDB_E_CLASSNOTREG");
    		break;
    	case CLASS_E_NOAGGREGATION:
    		//puts("Erreur CLASS_E_NOAGGREGATION ");
    		break;
    	case E_NOINTERFACE:
    		//puts("Erreur E_NOINTERFACE");
    		break;
    	default:
    		//puts("Impossible de r‚cup‚rer la IActiveDesktop");
    		break;
    	}//switch
     
    	//printf("hr=%08X - pt_desk=%08X\n", hr, pt_desk);
    	CoUninitialize();
     
    	return retour;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    malheureusement, je code en C++... je vais voir si je peux adapter les différents appels tout de même, merci, je test et je tiens au courant

    oé, hélas :
    main.cpp:77: error: `IActiveDesktop' undeclared (first use this function)
    main.cpp:77: error: (Each undeclared identifier is reported only once for each function it appears in.)
    main.cpp:77: error: `pt_desk' undeclared (first use this function)
    main.cpp:80: error: `CLSID_ActiveDesktop' undeclared (first use this function)
    main.cpp:80: error: `IID_IActiveDesktop' undeclared (first use this function)
    main.cpp:88: error: `AD_APPLY_ALL' undeclared (first use this function)
    pourtant j'ai vérifié les include...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Eh bien je ne comprends pas, c'est pourtant ainsi dans mon SDK...
    Peut-être que cette interface n'est pas incluse dans MinGW ?

    Dans <shlguid.h> :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // {75048700-EF1F-11D0-9888-006097DEACF9}
    DEFINE_GUID( CLSID_ActiveDesktop, 0x75048700L, 0xEF1F, 0x11D0, 0x98, 0x88, 0x00, 0x60, 0x97, 0xDE, 0xAC, 0xF9);
     
    // {F490EB00-1240-11D1-9888-006097DEACF9}
    DEFINE_GUID(IID_IActiveDesktop, 0xF490EB00L, 0x1240, 0x11D1, 0x98, 0x88, 0x00, 0x60, 0x97, 0xDE, 0xAC, 0xF9);
    Dans <shlobj.h> :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #undef INTERFACE
    #define INTERFACE IActiveDesktop
     
    DECLARE_INTERFACE_( IActiveDesktop, IUnknown )
    {
        // IUnknown methods
        STDMETHOD (QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
        STDMETHOD_(ULONG, AddRef) ( THIS ) PURE;
        STDMETHOD_(ULONG, Release) ( THIS ) PURE;
     
        // IActiveDesktop methods
        STDMETHOD (ApplyChanges)(THIS_ DWORD dwFlags) PURE;
        STDMETHOD (GetWallpaper)(THIS_ LPWSTR pwszWallpaper, UINT cchWallpaper, DWORD dwReserved) PURE;
        STDMETHOD (SetWallpaper)(THIS_ LPCWSTR pwszWallpaper, DWORD dwReserved) PURE;
        STDMETHOD (GetWallpaperOptions)(THIS_ LPWALLPAPEROPT pwpo, DWORD dwReserved) PURE;
        STDMETHOD (SetWallpaperOptions)(THIS_ LPCWALLPAPEROPT pwpo, DWORD dwReserved) PURE;
        STDMETHOD (GetPattern)(THIS_ LPWSTR pwszPattern, UINT cchPattern, DWORD dwReserved) PURE;
        STDMETHOD (SetPattern)(THIS_ LPCWSTR pwszPattern, DWORD dwReserved) PURE;
        STDMETHOD (GetDesktopItemOptions)(THIS_ LPCOMPONENTSOPT pco, DWORD dwReserved) PURE;
        STDMETHOD (SetDesktopItemOptions)(THIS_ LPCCOMPONENTSOPT pco, DWORD dwReserved) PURE;
        STDMETHOD (AddDesktopItem)(THIS_ LPCCOMPONENT pcomp, DWORD dwReserved) PURE;
        STDMETHOD (AddDesktopItemWithUI)(THIS_ HWND hwnd, LPCOMPONENT pcomp, DWORD dwReserved) PURE;
        STDMETHOD (ModifyDesktopItem)(THIS_ LPCCOMPONENT pcomp, DWORD dwFlags) PURE;
        STDMETHOD (RemoveDesktopItem)(THIS_ LPCCOMPONENT pcomp, DWORD dwReserved) PURE;
        STDMETHOD (GetDesktopItemCount)(THIS_ LPINT lpiCount, DWORD dwReserved) PURE;
        STDMETHOD (GetDesktopItem)(THIS_ int nComponent, LPCOMPONENT pcomp, DWORD dwReserved) PURE;
        STDMETHOD (GetDesktopItemByID)(THIS_ ULONG_PTR dwID, LPCOMPONENT pcomp, DWORD dwReserved) PURE;
        STDMETHOD (GenerateDesktopItemHtml)(THIS_ LPCWSTR pwszFileName, LPCOMPONENT pcomp, DWORD dwReserved) PURE;
        STDMETHOD (AddUrl)(THIS_ HWND hwnd, LPCWSTR pszSource, LPCOMPONENT pcomp, DWORD dwFlags) PURE;
        STDMETHOD (GetDesktopItemBySource)(THIS_ LPCWSTR pwszSource, LPCOMPONENT pcomp, DWORD dwReserved) PURE;
    };
    Dans <shlobj.h> également :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    //
    //  Flags and structures used by IActiveDesktop
    //
     
    typedef struct _tagWALLPAPEROPT
    {
        DWORD   dwSize;     // size of this Structure.
        DWORD   dwStyle;    // WPSTYLE_* mentioned above
    }
    WALLPAPEROPT;
     
    typedef WALLPAPEROPT  *LPWALLPAPEROPT;
    typedef const WALLPAPEROPT *LPCWALLPAPEROPT;
     
    typedef struct _tagCOMPONENTSOPT
    {
        DWORD   dwSize;             //Size of this structure
        BOOL    fEnableComponents;  //Enable components?
        BOOL    fActiveDesktop;     // Active desktop enabled ?
    }
    COMPONENTSOPT;
     
    typedef COMPONENTSOPT   *LPCOMPONENTSOPT;
    typedef const COMPONENTSOPT   *LPCCOMPONENTSOPT;
     
    typedef struct _tagCOMPPOS
    {
        DWORD   dwSize;             //Size of this structure
        int     iLeft;              //Left of top-left corner in screen co-ordinates.
        int     iTop;               //Top of top-left corner in screen co-ordinates.
        DWORD   dwWidth;            // Width in pixels.
        DWORD   dwHeight;           // Height in pixels.
        int     izIndex;            // Indicates the Z-order of the component.
        BOOL    fCanResize;         // Is the component resizeable?
        BOOL    fCanResizeX;        // Resizeable in X-direction?
        BOOL    fCanResizeY;        // Resizeable in Y-direction?
        int     iPreferredLeftPercent;    //Left of top-left corner as percent of screen width
        int     iPreferredTopPercent;     //Top of top-left corner as percent of screen height
    }
    COMPPOS;
     
    typedef COMPPOS *LPCOMPPOS;
    typedef const COMPPOS *LPCCOMPPOS;
     
    typedef struct  _tagCOMPSTATEINFO
    {
        DWORD   dwSize;             // Size of this structure.
        int     iLeft;              // Left of the top-left corner in screen co-ordinates.
        int     iTop;               // Top of top-left corner in screen co-ordinates.
        DWORD   dwWidth;            // Width in pixels.
        DWORD   dwHeight;           // Height in pixels.
        DWORD   dwItemState;        // State of the component (full-screen mode or split-screen or normal state.
    }
    COMPSTATEINFO;
     
    typedef COMPSTATEINFO   *LPCOMPSTATEINFO;
    typedef const COMPSTATEINFO *LPCCOMPSTATEINFO;
     
    typedef struct _tagCOMPONENT
    {
        DWORD   dwSize;             //Size of this structure
        DWORD   dwID;               //Reserved: Set it always to zero.
        int     iComponentType;     //One of COMP_TYPE_*
        BOOL    fChecked;           // Is this component enabled?
        BOOL    fDirty;             // Had the component been modified and not yet saved to disk?
        BOOL    fNoScroll;          // Is the component scrollable?
        COMPPOS cpPos;              // Width, height etc.,
        WCHAR   wszFriendlyName[MAX_PATH];          // Friendly name of component.
        WCHAR   wszSource[INTERNET_MAX_URL_LENGTH]; //URL of the component.
        WCHAR   wszSubscribedURL[INTERNET_MAX_URL_LENGTH]; //Subscrined URL
     
        //New fields are added below. Everything above here must exactly match the IE4COMPONENT Structure.
        DWORD           dwCurItemState; // Current state of the Component.
        COMPSTATEINFO   csiOriginal;    // Original state of the component when it was first added.
        COMPSTATEINFO   csiRestored;    // Restored state of the component.
    }
    COMPONENT;
     
    typedef COMPONENT *LPCOMPONENT;
    typedef const COMPONENT *LPCCOMPONENT;
    Dans <shlobj.h> encore :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    ////////////////////////////////////////////
    // Flags for IActiveDesktop::ApplyChanges()
    #define AD_APPLY_SAVE             0x00000001
    #define AD_APPLY_HTMLGEN          0x00000002
    #define AD_APPLY_REFRESH          0x00000004
    #define AD_APPLY_ALL              (AD_APPLY_SAVE | AD_APPLY_HTMLGEN | AD_APPLY_REFRESH)
    #define AD_APPLY_FORCE            0x00000008
    #define AD_APPLY_BUFFERED_REFRESH 0x00000010
    #define AD_APPLY_DYNAMICREFRESH   0x00000020
     
    ////////////////////////////////////////////
    // Flags for IActiveDesktop::GetWallpaperOptions()
    //           IActiveDesktop::SetWallpaperOptions()
    #define WPSTYLE_CENTER      0
    #define WPSTYLE_TILE        1
    #define WPSTYLE_STRETCH     2
    #define WPSTYLE_MAX         3
    Là, à moins que je ne me sois trompé, tu as tout ce dont tu as besoin pour déclarer ce dont tu as besoin de l'interface.

    Ou peut-être n'as-tu pas vérifié les defines de WINVER, _WIN32_IE et _WIN32_WINNT ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    ça c'est amélioré :
    main.cpp:86: error: 'struct IActiveDesktop' has no member named 'lpVtbl'
    main.cpp:90: error: 'struct IActiveDesktop' has no member named 'lpVtbl'
    :\

    pour les constantes préproc, _WIN32_IE n'existe pas, mais la définir avant les includes ne modifie rien du tout (j'ai testé 0x0400 et 0x0401)...

    les deux autres valent 1024 (0x0400)
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    lpVtbl n'est là qu'en C, tout comme le premier paramètre.

    Pour le C++, au lieu de :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    pt_desk->lpVtbl->SetWallpaperOptions(pt_desk, &wpo,0);
    Il suffit de faire :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    pt_desk->SetWallpaperOptions(&wpo,0);

    C'est là toute l'utilité de DECLARE_INTERFACE : Une vraie classe en C++, un hack en C...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    On s'approche de la fin beaucoup Medinoc !

    maintenant, il me reproche de vouloir convertir un const char* en const WCHAR*, j'ai bien cherché pour faire la conversion, mais il ne semble pas y avoir de fonction permettant de le faire... tant en C qu'en C++... et j'ose pas trop bidouillé les en-têtes pour mettre des char classiques...

    au fait, tant que j'y pense, y'a un truc supplémentaire à linker ? (parce que je les sens bien venir les undefined reference aussi XD)
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pour convertir en WCHAR *, tu peux utiliser MultiByteToWideChar() (un appel pour connaitre la taille, un autre pour effectuer la conversion).

    Ce wrapper peut être utile :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    BOOL GetUnicodeStringFromMultiByteString(
     LPCSTR sczMultiByteString,
     LPWSTR * p_szUnicodeString,
     UINT nCodePage,
     size_t * pCchBufferSize
     )
    {
    	bool	bOK = false;
     
    	if(pCchBufferSize != NULL)
    		*pCchBufferSize = 0;
     
    	if(p_szUnicodeString != NULL && sczMultiByteString != NULL)
    	{
    		assert(*p_szUnicodeString == NULL);
     
    		*p_szUnicodeString = NULL;
     
    		try 
    		{
    			//MultiByteToWideChar() with a zero buffer returns the buffer size, including the null character.
    			int nUnicodeBufferSize = MultiByteToWideChar(
    			 nCodePage, 0,
    			 sczMultiByteString, -1,
    			 NULL_W, 0
    			 );
    			assert(nUnicodeBufferSize >= 0);
    			//If got the buffer size, allocate it.
    			//Otherwise, it will remain NULL.
    			if(nUnicodeBufferSize != 0)
    				*p_szUnicodeString = new WCHAR[ nUnicodeBufferSize ];
    			//If the buffer was allocated, fill it.
    			if( *p_szUnicodeString != NULL )
    			{
    				WCHAR nullTerminator = L'\0';
    				*p_szUnicodeString[ 0 ] = nullTerminator;
     
    				int nReturn = MultiByteToWideChar(
    				 nCodePage, 0,
    				 sczMultiByteString, -1,
    				 *p_szUnicodeString, nUnicodeBufferSize
    				 );
     
    				if(nReturn != 0)
    				{
    					bOK = true;
    					if(pCchBufferSize != NULL)
    						*pCchBufferSize = static_cast< unsigned int >(nUnicodeBufferSize);
    				}
    			}//if
    		}
    		catch(...)
    		{
    			//TRACE0("Caught exception in MultiByteToWideChar!\n");
    			bOK = false;
    			delete[] *p_szUnicodeString;
    			*p_szUnicodeString = NULL;
    		}
    	}//if
     
    	return BOOL(bOK);
    }
    (Bon, j'ai trouvé ce code dans ma boîte, mais le coup de l'exception peut être viré, puisque catch(...) ne capture plus les access violation...)
    Note: Pour la codepage, si tu ne sais pas quoi mettre, généralement on met CP_ACP.

    Quant aux librairies, c'est là toute la puissance de COM : Normalement, aucun problème.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Citation Envoyé par Médinoc
    Quant aux librairies, c'est là toute la puissance de COM : Normalement, aucun problème.
    et pourtant :
    .objs\main.o:main.cpp.text+0x10f5): undefined reference to `CoInitialize@4'
    .objs\main.o:main.cpp.text+0x110a): undefined reference to `IID_IActiveDesktop'
    .objs\main.o:main.cpp.text+0x1121): undefined reference to `CLSID_ActiveDesktop'
    .objs\main.o:main.cpp.text+0x1126): undefined reference to `CoCreateInstance@20'
    .objs\main.o:main.cpp.text+0x16cb): undefined reference to `CoUninitialize@0'
    pour le moment, le seul truc que j'ai de linké c'est libuser32.a (mais je vais le virer quand tout marchera puisqu'il a l'air de servir à rien ... )
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ah, oui, je pensais que c'était dans les bibliothèques par défaut (ça l'est sous Visual).
    Les fonctions COM se trouvent dans ole32.lib, d'après MSDN (donc, sans doute libole32.a).

    Quant aux GUID, il y a un header (je ne sais plus lequel) à inclure dans UN SEUL source juste avant celui qui les déclare pour qu'ils soient définis.
    Je crois que c'est un header du genre initguid.h...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    OK, bon maintenant ça compile... mais au bout de 6secondes l'appli plante... bon, je vais tester puis je vous tiens au courant... Medinoc
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  17. #17
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    OK, ça venait des assert()... passent pas en C++ à priori XD

    alors, maintenant deux nouvelles (une bonne et une mauvaise ):

    La bonne : ça fonctionne c'est super, Medinoc ...
    La mauvaise : il y a quelques bugs que j'avais vu sur une des applications, à savoir, si par exemple, on a une selection en cours au moment du changement de Wall, les pointillés de sélection restent incrustés dans le nouveau fond jusqu'au prochain changement :'( et divers bugs si on fait un clique de souris au moment du changement de wall...

    est-ce que tu aurais une idée pour arranger cela ?
    Si non, je m'en conteterais et je marquerais :résolu:, c'est déjà super, puis les bugs c'est que de l'affichage et ça se produit pas tout le temps ^^ l'appli est pas non destinée à être diffusée largement
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  18. #18
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Eh bien, les pointillés de sélection, malheureusement, je ne les ai jamais étudiés...
    Mais je pense que je sais pourquoi ça buggue : C'est du XOR, donc l'arrière-plan est affiché avant l'effacement...

    Ce qu'il faudrait, c'est un moyen de réafficher les pointillés immédiatement après avoir changé l'arrière-plan (et encore, il peut y avoir de méchantes "race conditions" qui peuvent faire que la solution d'un cas devient le problème de l'autre...)

    Quant à moi, j'utilisais juste ça dans un programme de choix d'arrière-plan aléatoire au démarrage. Mais depuis mon dernier format, je ne l'ai pas remis: Je garde mon arrière-plan actuel, un fan art d'El Goonish Shive...

    PS: L'assertion qui foire, apparamment, exigeait que le pointeur pointé soit NULL avant l'appel de la fonction.
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LPWSTR szWallW = NULL;
    GetUnicodeStringFromMultiByteString("Arrplan.jpg", &szWallW, CP_ACP, NULL);
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  19. #19
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    OK, ça sert à rien de monter une usine à gaz alors, pour une utilisation personnelle, c'est parfait...

    beaucoup !
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 07/07/2009, 17h12
  2. SpagoBi et LDAP (Active Directory plus précisément)
    Par floritude dans le forum SpagoBI
    Réponses: 1
    Dernier message: 25/06/2009, 09h47
  3. Rafraichir le bureau
    Par kor6k dans le forum C++
    Réponses: 3
    Dernier message: 24/04/2006, 11h43
  4. Bureau plus grand que l'ecran
    Par taitaitai71 dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 21/04/2006, 09h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo