Actualisation Refresh.exe

Signaler
Messages postés
15
Date d'inscription
jeudi 31 janvier 2008
Statut
Membre
Dernière intervention
10 juin 2008
-
Messages postés
15
Date d'inscription
jeudi 31 janvier 2008
Statut
Membre
Dernière intervention
10 juin 2008
-
Bonjour à tous. Je suis un petit newbie qui parcours humblement ce forum à l'aide d'un problème si simple pour vous que vous en rirez...

Je ne suis pas programmeur, donc je n'y comprends pas grand chose.
Je fais essentiellement des scripts en batch windows, ça m'aide à installer mes programmes plus facilement et plus clairement.

Mais le batch windows est assez pauvre. Pour créer des raccourcis, j'utilise un programme qui s'appelle shortcut.exe.

Mon problème, c'est que j'ai besoin d'actualiser le bureau via une commande batch.
- J'ai cherché dans les commandes => Rien
- J'ai cherché dans les arguments d'explorer.exe => Rien
- J'ai pas trouvé de dll qui fasse ça non plus, il en existe peut-être une, si quelqu'un la connait, merci de me répondre, ce serait super sympa.

Bref, j'ai entendu parler d'un petit programme nommé refresh.exe qui permettait de rafraichir le bureau tout simplement, et qu'on pouvait trouver sur ce site.
Quelqu'un sait-il où se trouve ce programme ?
Sinon, quelqu'un pourrait-il me le coder svp ?
Si ça ne vous prend pas trop de temps bien entendu...

11 réponses

Messages postés
15
Date d'inscription
jeudi 31 janvier 2008
Statut
Membre
Dernière intervention
10 juin 2008

C'est bon, no problème, j'ai trouvé...
Un type m'a renseigné sur un autre forum...

"%windir%\System32\RUNDLL32.EXE" user32.dll,UpdatePerUserSystemParameters

Plus besoin de source...

@+
Messages postés
15
Date d'inscription
jeudi 31 janvier 2008
Statut
Membre
Dernière intervention
10 juin 2008

Et ben non.

En fait ça marche pas du tout.

Mon truc actualise certaines choses comme le wallpaper, mais depuis que Kro a viré la fonction repaintscreen de user.dll, pas moyen.

Si vous avez une solution pour le faire en vbs, je suis preneur.

Sinon il y a une solution ici.
http://blogs.sepago.de/helge/2007/11/22/free-tool-refresh-the-desktop-programmatically/
Messages postés
15
Date d'inscription
jeudi 31 janvier 2008
Statut
Membre
Dernière intervention
10 juin 2008

Son utilitaire pourri, en plus d'être lent, ne fonctionne pas.
desktoprefresh.exe n'actualise que le bureau, pas le reste.
Ca sert à rien en fait.

Le seul moyen est de killer l'explorer avec
taskkill /f /IM explorer.exe
start %WinDir%\explorer.exe

Je vais me pencher sur la question voir si je trouve autre chose.
Après tout, si le bouton "appliquer" peut le faire, c'est que c'est faisable.
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Bonjour,

Essayer avec ce petit programme (en tant qu'utilitaire dans le batch) :

#include <windows.h>
int WINAPI WinMain
(
    HINSTANCE hInstance      // E:instance courante
   ,HINSTANCE hInstancePrev  // E:instance précédente
   ,LPSTR     pszCommandLine // E:ligne de commande
   ,int       iDisplay       // E:mode d'affichage
)                            // S:code retour
{
   // --- Lire le handle du "program manager"
   HWND hProgMan = FindWindow("progman",NULL);

   // --- Poster l'appui sur la touche F5 (rafraîchir)
   if (hProgMan) PostMessage(hProgMan,WM_KEYDOWN,VK_F5,0);
   return 0;
}

Jean-François
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Ou même sans passer par un programme de type Application Windows mais plus simplement de type Console (testé sous Microsoft Visual C++ 6.0) :

#include <windows.h>
int main(void)
{
   // --- Lire le handle du "program manager"
   HWND hProgMan = FindWindow("progman",NULL);

   // --- Poster l'appui sur la touche F5 (rafraîchir)
   if (hProgMan) PostMessage(hProgMan,WM_KEYDOWN,VK_F5,0);
   return 0;
}

Jean-François
Messages postés
15
Date d'inscription
jeudi 31 janvier 2008
Statut
Membre
Dernière intervention
10 juin 2008

J'ai compilé et essayé tes programmes, ça ne marche pas.


Ton programme mime la touche F5 qui actualise uniquement le bureau, c'est à dire le wallpaper uniquement.


Il y a 36 moyens de faire ça, en vbs, en batch avec la fonction de user32.dll UpdatePerUserSystemParameters, j'ai déjà essayé.


Actualiser l'explorer.exe est bien différent.

Pour m'entraîner en batch, je m'amuse à faire des scripts. Le problème se pose ici avec un script pour actualiser directement les fichiers cachés.
En voici le code (désolé c'est en chantier mais ça marche).

J'ai bien peur qu'il n'existe aucune méthode, car il existait avant la fonction repaintscreen de user.dll sur les anciennes version de Windows.

Mais depuis Windows NT4, Microsoft a supprimé cette fonction et a verrouillé son explorer.exe. Par sécurité ?

Bref, ma dernière piste actuelle est de trouver les fonctions d'une dll qui aurait celle-ci, seulement il faut être inscrit à la MSDN en tant que développeur pour avoir accès à ces données.
Si quelqu'un peut m'aider... Son aide sera plus que bienvenue.

@echo off
cls
REM Script standard de paramètrage du registre de Windows
REM Non compatible pour les versions plus anciennes que Windows XP

REM Ce script est fait pour être évolutif sans avoir à en modifier le corps

REM Vous pouvez rajouter autant de données que vous le voulez à la suite
REM en ajoutant un autre groupe : key_1 key_2 key_2 etc.
REM mais attention, la comparaison se fera toujours sur key_1

REM ________________________________________________________________
REM Description du script :

REM Sert à masquer ou démasquer les
REM fichiers cachés de Windows

REM ________________________________________________________________
REM Tête du script (Head) : Seule cette partie doit être changée

REM ******************************************
set add_registry_loop=0
: head_1

REM Boucle d'exécution du script pour que toutes
REM les valeurs successives soient prises en compte
set /a add_registry_loop=%add_registry_loop% + 1

REM Ajoutez ici le nombre de clés à modifier en rajoutant des lignes
REM (Il doit y avoir autant de lignes que de "key_?")
if "%add_registry_loop%" EQU "1" goto key_1
if "%add_registry_loop%" EQU "2" goto key_2
if "%add_registry_loop%" EQU "3" goto exit

cls
echo.
echo.
echo.
echo Erreur de ce script dans la boucle de redondance.
echo.
echo Par s‚curit‚, il va donc s'arrˆter.
echo.
echo.
echo.
echo Appuyez sur une touche pour fermer ce script...
pause>nul
exit

REM ******************************************
REM Données utiles à l'exécution du script

REM Clé(s), valeur(s), type(s) et donnée(s) du registre à créer, modifier
REM On mettra la description en dessous de la donnée
REM Attention, la syntaxe de la donnée doit correspondre au type
REM (On mettra toujours les DWORD en hexadécimal avec 0x devant)

: key_1
set add_registry_key=HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced
set add_registry_value=Hidden
set add_registry_type=REG_DWORD
set add_registry_data_1=0x00000000
REM Donnée à 0 = Fichiers cachés invisibles
set add_registry_data_2=0x00000001
REM Donnée à 1 = Fichiers cachés visibles
goto head_2

: key_2
set add_registry_key=HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced
set add_registry_value=SuperHidden
set add_registry_type=REG_DWORD
set add_registry_data_1=0x00000000
REM Donnée à 0 = Fichiers super-cachés invisibles
set add_registry_data_2=0x00000001
REM Donnée à 1 = Fichiers super-cachés visibles
goto head_2

REM Rien à faire ici ce bloc ! Penser à le virer
REM Clé(s) et valeur(s) du registre à supprimer

REM : key_del_1
REM del_registry_key=
REM On met "REM" car il n'y en a aucune

REM ******************************************
: head_2
REM Switchs, aiguillages du reste du script

REM Rajouter un "faut-il détécter la version de Windows"

REM Faut-il détécter la donnée d'une clé de registre ?REM (0 Non) (1 ou + Oui)
set registry_match=1

REM Faut-il supprimer des clés de registre ?REM (0 Non) (1 ou + Oui)
set registry_delete=0

REM ________________________________________________________________
REM Corps du script

REM ******************************************
REM Détection de la version de Windows

REM On détecte la version de Windows à la nature du dossier de tous les utilisateurs
REM Ce sera "Documents and Settings" pour XP et "ProgramData" pour Vista
REM Cette donnée est contenue dans la variable d'environnement "ALLUSERSPROFILE"

if "%ALLUSERSPROFILE%"=="C:\Documents and Settings\All Users" goto windows_xp
if "%ALLUSERSPROFILE%"=="C:\ProgramData" goto windows_vista
goto windows_error

: windows_xp
set os_version=xp
goto body_1

: windows_vista
set os_version=vista
goto body_1

: windows_error
cls
echo.
echo.
echo.
echo Ce script n'a pas r‚ussi … d‚tecter votre version de Windows.
echo.
echo Par s‚curit‚, il va donc s'arrˆter.
echo.
echo.
echo.
echo Appuyez sur une touche pour fermer ce script...
pause>nul
exit

REM ******************************************
: body_1
REM Détection de l'existence des éléments du script

REM if exist, si clé registre n'existe pas, proposer de les créer
REM à continuer

REM ******************************************
REM Accomplissement des tâches

REM ---------------------------
REM Aiguillage vers la détection d'une donnée du registre

REM Si le switch de comparaison de valeurs de registre est
REM activé (supérieur ou égal (GEQ) à 1), aller à l'indicateur
REM nommé "body_2", sinon, aller directement à
REM  l'indicateur nommé "body_3"

if "%registry_match%" GEQ "1" goto body_2
goto body_3

REM ---------------------------
: body_2
REM Détection d'une donnée du registre :

REM Ajout d'une clé de registre temporaire avec une donnée connue
reg add "%add_registry_key%_temp" /v "%add_registry_value%" /t "%add_registry_type%" /d "%add_registry_data_1%" /f >nul

REM Comparaison de la donnée d'une même valeur
REM pour la clé existante avec la clé temporaire
REM Le résultat est automatiquement stocké dans la variable "ERRORLEVEL"REM %ERRORLEVEL% 0> Résultats identiques, la donnée est la mêmeREM %ERRORLEVEL% 2> Résultats différents, les données sont différentesREM %ERRORLEVEL% 1> Echec de la comparaison, une des données n'existe pas
reg compare "%add_registry_key%" "%add_registry_key%_temp" /v "%add_registry_value%" >nul

REM On sauve le résultat dans une variable car ERRORLEVEL
REM est remise à 0 à chaque commande
set error_level=%ERRORLEVEL%

REM On efface la clé temporaire
reg delete "%add_registry_key%_temp" /f >nul

REM On définit l'aiguillage pour l'alternance des différents choix
if "%error_level%"=="0" goto add_registry_data_1
if "%error_level%"=="2" goto add_registry_data_2
if "%error_level%"=="1" goto add_registry_data_2
cls
echo.
echo.
echo.
echo Ce script n'a pas r‚ussi … d‚tecter la cl‚ de registre
echo n‚cessaire … son ex‚cution
echo.
echo Par s‚curit‚, il va donc s'arrˆter.
echo.
echo.
echo.
echo Appuyez sur une touche pour fermer ce script...
pause>nul
exit

REM ---------------------------
REM Alternance de changement des clés de registre

: add_registry_data_1
reg add "%add_registry_key%" /v "%add_registry_value%" /t "%add_registry_type%" /d "%add_registry_data_2%" /f >nul
goto body_3

: add_registry_data_2
reg add "%add_registry_key%" /v "%add_registry_value%" /t "%add_registry_type%" /d "%add_registry_data_1%" /f >nul

REM ---------------------------
: body_3
REM

REM ________________________________________________________________
REM Queue du script

goto head_1

: exit

REM "%WINDIR%\system32\rundll32.exe" user32.dll,RepaintScreen ne marche pas.
REM trouver un autre moyen...

REM Création d'un fichier .vbs
REM Ne pas oublier de mettre des ^devant des caractères comme & ou |
rem echo Set WSHShell = CreateObject("WScript.Shell") >refresh.vbs
rem echo WshShell.SendKeys "{F5}" >>refresh.vbs

REM seul moyen actuellement
rem taskkill /f /IM explorer.exe
rem start %WinDir%\explorer.exe

REM essayer de trouver des points d'entrée dans user32.dll avec dumpbin du compilateur visual C
REM en tapant dumpbin /exports user32.dll ou link /dump /exports user32.dll pour obtenir des noms de fonctions

cls
exit
Messages postés
55
Date d'inscription
lundi 15 septembre 2003
Statut
Membre
Dernière intervention
11 mai 2008

Bonjour,

dans le cas general voici comment faire:
- recherhcer le PID de l'explorer.exe (enumeration des fenetre et filtrage par type)
=> HWND
- emuler l'envoi de la touche F5:
INPUT *input = new INPUT;
ZeroMemory(input,sizeof(INPUT));
input->type = INPUT_KEYBOARD;
input->ki.wVk = VK_F5;
input->ki.dwFlags = 0;
int res = SendInput(1, input,sizeof(INPUT));
delete input;

dans ton cas, je crois qu'en fait c'est plus simple
HWND hWnd = GetDesktopWindow();
InvalidateRect(hWnd,NULL,NULL);

voici le code complet que j'utilisais a l'epoque:
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{

/*
    InvalidateRect(NULL,NULL,TRUE);
    InvalidateRect(GetDesktopWindow(),NULL,TRUE);
*/

    // send F5 au bureau ne fonctionne pas
    //    SendMessage(GetDesktopWindow(),WM_KEYDOWN,VK_F5,0);

    // sendKey(F5)
    INPUT *input = new INPUT;
    ZeroMemory(input,sizeof(INPUT));
    input->type = INPUT_KEYBOARD;
    input->ki.wVk = VK_F5;
    input->ki.dwFlags = 0;
    int res = SendInput(1, input,sizeof(INPUT));
    delete input;

    return 0;
}

J'espere que ce marche

@++
Messages postés
15
Date d'inscription
jeudi 31 janvier 2008
Statut
Membre
Dernière intervention
10 juin 2008

Euh... A sa lecture, j'ai peu que ce prog ne fasse que mimer f5, ce que j'ai déjà tenté.

Mais j'ai un problème de compilation (j'utilise Dev C++)

[cpp]
#include <Windows.h>

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow);

/*
    InvalidateRect(NULL,NULL,TRUE);
    InvalidateRect(GetDesktopWindow(),NULL,TRUE);
*/

    // send F5 au bureau ne fonctionne pas
    //    SendMessage(GetDesktopWindow(),WM_KEYDOWN,VK_F5,0);

    // sendKey(F5)
INPUT *input = new INPUT;
ZeroMemory(input,sizeof(INPUT));
input->type = INPUT_KEYBOARD;
    input->ki.wVk = VK_F5;
    input->ki.dwFlags = 0;
    int res = SendInput(1, input,sizeof(INPUT));
    delete input;

    return 0;
}
/cpp
Il me met
17 - expected constructor, destructor, or type conversion before '*' token
Euh... Ca veut dire quoi ?
Messages postés
15
Date d'inscription
jeudi 31 janvier 2008
Statut
Membre
Dernière intervention
10 juin 2008

J'ai utilisé ça

#include <windows.h>int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{

    InvalidateRect(NULL,NULL,TRUE);
    InvalidateRect(GetDesktopWindow(),NULL,TRUE);

    return 0;
}

Ca marche toujours pas, ça fait pareil que F5... Snif...
Messages postés
15
Date d'inscription
jeudi 31 janvier 2008
Statut
Membre
Dernière intervention
10 juin 2008

Idem avec ça

#include <cstdlib>
#include
#include <shlobj.h>using namespace std;

int main(int argc, char *argv[])
{
    LPITEMIDLIST ptrItem = NULL;
   
    SHGetSpecialFolderLocation(NULL,CSIDL_DESKTOP,&ptrItem);
    SHChangeNotify(SHCNE_ALLEVENTS,SHCNF_IDLIST,&ptrItem,0);
   
    //system("PAUSE");
    return EXIT_SUCCESS;
}
Messages postés
15
Date d'inscription
jeudi 31 janvier 2008
Statut
Membre
Dernière intervention
10 juin 2008

D'après la MSDN, il existe la fonction SHChangeNotify de Shell32.dll 

appeller avec les flags corrects), qui permet de rafraîchir un dossier
spécifié (ici le bureau, si on l'utilise dans un vbs ou vb, il faut utiliser SHGetSpecialFolderLocationD)

A essayer.

Si quelqu'un lit ce forum, peut-il essayer sur son PC ?
Peut-être que c mon OS qui déconne après tout...

Voyez le code du batch sur la page d'avant...