MEGA NIOUZ: [API (vb)] prob avec InvalidateRect

MEGA NIOUZ: [API (vb)] prob avec InvalidateRect - VB/VBA/VBS - Programmation

Marsh Posté le 15-05-2002 à 02:07:36    

tout est ds le titre
 
je cherche la methode, ke je suppose etre a base d'api, ki permettent de rafraichir le bureau, apres un ajout de raccourci ou le changement de papier peint, par exemple
 
 
merci :)

 

[jfdsdjhfuetppo]--Message édité par Leirn le 15-05-2002 à 19:09:19--[/jfdsdjhfuetppo]


---------------
"Je brandirai une épée d'orichalque, je m'assouvirai sur des Templiers." | "Avec dans son sillage l'Ombre du Diable, Leirn appelait les morts pour une danse macabre et déchainaît les horreurs de la nuit..."
Reply

Marsh Posté le 15-05-2002 à 02:07:36   

Reply

Marsh Posté le 15-05-2002 à 02:32:02    

GetDesktopWindow() pour récupérer un handle vers le desktop
 
InvalidateRect() pour rafraîchir une fenêtre
 
a + b = rafraîchissement du desktop

Reply

Marsh Posté le 15-05-2002 à 10:07:17    

je test, je vous tiens au courant


---------------
"Je brandirai une épée d'orichalque, je m'assouvirai sur des Templiers." | "Avec dans son sillage l'Ombre du Diable, Leirn appelait les morts pour une danse macabre et déchainaît les horreurs de la nuit..."
Reply

Marsh Posté le 15-05-2002 à 10:56:24    

g un peu de mal avec InvalidateRect...
 
msdn dit de passer l'argument lerect comme null, mais ca posse po chez moa :/


---------------
"Je brandirai une épée d'orichalque, je m'assouvirai sur des Templiers." | "Avec dans son sillage l'Ombre du Diable, Leirn appelait les morts pour une danse macabre et déchainaît les horreurs de la nuit..."
Reply

Marsh Posté le 15-05-2002 à 11:11:43    

Non, InvalidateRect() prend 2 arguments :
 
- Le 1er indique l'adresse de la structure RECT à rafraichir
- Le 2eme est un BOOL indiquant si le rectangle doit être effacé ou non (TRUE par défaut)
 
Donc, tu fais ceci :
 
RECT clientrect;
clientrect = GetClientRect(&clientrect);
InvalidateRect(&clientrect);


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2002 à 11:13:48    

InvalidateRect
The InvalidateRect function adds a rectangle to the specified window's update region. The update region represents the portion of the window's client area that must be redrawn.  
 
BOOL InvalidateRect(
  HWND hWnd,  // handle of window with changed update region
  CONST RECT *lpRect,
              // address of rectangle coordinates
  BOOL bErase // erase-background flag
);
 
Parameters
hWnd  
Handle to the window whose update region has changed. If this parameter is NULL, the system invalidates and redraws all windows, and sends theWM_ERASEBKGND and WM_NCPAINT messages to the window procedure before the function returns.  
lpRect  
Pointer to a RECT structure that contains the client coordinates of the rectangle to be added to the update region. If this parameter is NULL, the entire client area is added to the update region.  
bErase  
Specifies whether the background within the update region is to be erased when the update region is processed. If this parameter is TRUE, the background is erased when the BeginPaint function is called. If this parameter is FALSE, the background remains unchanged.  
Return Values
If the function succeeds, the return value is nonzero.
 
If the function fails, the return value is zero.  
 
Windows NT: To get extended error information, callGetLastError.
 
Remarks
The invalidated areas accumulate in the update region until the region is processed when the next WM_PAINT message occurs or until the region is validated by using the ValidateRect or ValidateRgn function.  
 
The system sends a WM_PAINT message to a window whenever its update region is not empty and there are no other messages in the application queue for that window.  
 
If the bErase parameter is TRUE for any part of the update region, the background is erased in the entire region, not just in the given part.  
 
Windows CE: The hWnd parameter cannot be NULL.
 
QuickInfo
  Windows NT: Requires version 3.1 or later.
  Windows: Requires Windows 95 or later.
  Windows CE: Requires version 1.0 or later.
  Header: Declared in winuser.h.
  Import Library: Use user32.lib.
 
 
c pour ca :D
 
apparament yaurai plusieurs facon de la declaré...
 
je regarde ta methode, thx


---------------
"Je brandirai une épée d'orichalque, je m'assouvirai sur des Templiers." | "Avec dans son sillage l'Ombre du Diable, Leirn appelait les morts pour une danse macabre et déchainaît les horreurs de la nuit..."
Reply

Marsh Posté le 15-05-2002 à 11:15:40    

note: je fais du VB


---------------
"Je brandirai une épée d'orichalque, je m'assouvirai sur des Templiers." | "Avec dans son sillage l'Ombre du Diable, Leirn appelait les morts pour une danse macabre et déchainaît les horreurs de la nuit..."
Reply

Marsh Posté le 15-05-2002 à 11:23:27    

Je fais du C++ et MFC... tout s'explique ! Normal que tu aies 3 arguments, moi je n'ai pas besoin du hwnd car j'hérite de CWnd qui possède un membre hwnd à sa création.
 
Sous VB, il me semble qu'une fonction te retourne le hwnd de ta fenêtre je pense.


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2002 à 11:26:21    

de la fenetre oui... j'utilise GetDesktopWindow, ki me retourne gentiment 128...
 
mais lis tout le topic, je reprend la methode de you dont care...


---------------
"Je brandirai une épée d'orichalque, je m'assouvirai sur des Templiers." | "Avec dans son sillage l'Ombre du Diable, Leirn appelait les morts pour une danse macabre et déchainaît les horreurs de la nuit..."
Reply

Marsh Posté le 15-05-2002 à 11:27:32    

Quand on veut tout rafraîchir, je fais InvalidateRect(hWnd, NULL, TRUE); (de mémoire, faillible).
 
Declare Function GetdesktopWindow Lib "user32" () As Long
 
Faudrait essayer
dim hwnd& (& : long je crois, sais plus trop)
hwnd& = GetdesktopWindow();
InvalidateRect(hwnd, 0, 1); ' je sais plus si 1 est TRUE  :??:  
 
Sans garantie, ai rien pour tester (sauf en BC ..).

Reply

Marsh Posté le 15-05-2002 à 11:27:32   

Reply

Marsh Posté le 15-05-2002 à 11:32:33    

oki, ca passais pas pcq je mettais null au lieu de zero en param
 
 
je test avec ca...
hWnd est bien long, tu as une memoire tres correct ;)
 
InvalidateRect me repond ByRef argument type mismatch au nivo du zero :/
 
il veut un RECT  :cry:


---------------
"Je brandirai une épée d'orichalque, je m'assouvirai sur des Templiers." | "Avec dans son sillage l'Ombre du Diable, Leirn appelait les morts pour une danse macabre et déchainaît les horreurs de la nuit..."
Reply

Marsh Posté le 15-05-2002 à 11:33:30    

OK, donc ce que tu as a faire c'est d'initialiser une structure RECT et de passer son adresse à InvalidateRect
 
A mon avis, ça ne marche pas car tu passes NULL pour cet argument. Tu rafraichis ainsi la fenêtre de ton application, et non celle du bureau.
 
Récupère le rectangle client du bureau avec GetClientRect dans ta structure RECT, puis passe une référence à cette structure en argument de InvalidateRect :
 
hwnd& = GetdesktopWindow()  
InvalidateRect(hwnd, rect)
 
2 paramètres, car le 3eme est TRUE par défaut (on efface le rectangle)

 

[jfdsdjhfuetppo]--Message édité par Harkonnen le 15-05-2002 à 11:35:50--[/jfdsdjhfuetppo]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2002 à 11:40:02    

le 3eme param est pas optionnel, alors je laisse zero... mais ca march epo plus...et pis, fo rien mettre ds le rect? enifn a part le declarer


---------------
"Je brandirai une épée d'orichalque, je m'assouvirai sur des Templiers." | "Avec dans son sillage l'Ombre du Diable, Leirn appelait les morts pour une danse macabre et déchainaît les horreurs de la nuit..."
Reply

Marsh Posté le 15-05-2002 à 11:47:51    

Leirn a écrit a écrit :

le 3eme param est pas optionnel, alors je laisse zero




 
Attention, 0 = False, donc tu n'effaces pas ton rectangle
 
Pour le RECT, voici la structure :
 

Code :
  1. typedef struct tagRECT {
  2.    LONG left;
  3.    LONG top;
  4.    LONG right;
  5.    LONG bottom;
  6. } RECT


Le mieux je pense est effectivement d'initialiser chaque champ de cette structure à 0.


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2002 à 11:52:19    

oki, j'avais deja créé la structure...
 
mon dernier param estait bien 1 en fait
j'initialise tout a zero et...
 
 
 
 
 
 
 
 
marche po
 
 
 
 
Public Sub Refresh_Desktop()
    Dim hWnd As Long
    Dim recte As RECT
    Dim test As Long
    With recte
    .top = 0
    .left = 0
    .right = 0
    .bottom = 0
    End With
 
    hWnd& = GetDesktopWindow()
    Call InvalidateRect(hWnd, recte, 1)
End Sub

 

[jfdsdjhfuetppo]--Message édité par Leirn le 15-05-2002 à 11:52:55--[/jfdsdjhfuetppo]


---------------
"Je brandirai une épée d'orichalque, je m'assouvirai sur des Templiers." | "Avec dans son sillage l'Ombre du Diable, Leirn appelait les morts pour une danse macabre et déchainaît les horreurs de la nuit..."
Reply

Marsh Posté le 15-05-2002 à 11:54:44    

Est ce que RECT fait partie des types de données acceptés par VB ?? J'en suis pas sur du tout, tu devrais essayer de créer la structure directement dans ton source.
 
Et déclares tu tes API au début du source ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2002 à 11:58:52    

g créé la structure directement dans mon source deja:
 
 
Type RECT
    left As Long
    top As Long
    right As Long
    bottom As Long
End Type
 
c comme ca?


---------------
"Je brandirai une épée d'orichalque, je m'assouvirai sur des Templiers." | "Avec dans son sillage l'Ombre du Diable, Leirn appelait les morts pour une danse macabre et déchainaît les horreurs de la nuit..."
Reply

Marsh Posté le 15-05-2002 à 11:59:25    

et je declare mes api
 
Public Declare Function GetDesktopWindow Lib "user32" () As Long
Public Declare Function InvalidateRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT, ByVal bErase As Long) As Long
Public Declare Function GetClientRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT) As Long
 
 
 
syntaxe fournie par api viewer


---------------
"Je brandirai une épée d'orichalque, je m'assouvirai sur des Templiers." | "Avec dans son sillage l'Ombre du Diable, Leirn appelait les morts pour une danse macabre et déchainaît les horreurs de la nuit..."
Reply

Marsh Posté le 15-05-2002 à 12:13:13    

sinon avec le hWnd ya moyen d'envoyer un F5? c moins propre, mais bon...


---------------
"Je brandirai une épée d'orichalque, je m'assouvirai sur des Templiers." | "Avec dans son sillage l'Ombre du Diable, Leirn appelait les morts pour une danse macabre et déchainaît les horreurs de la nuit..."
Reply

Marsh Posté le 15-05-2002 à 12:20:45    

Tu as oublié le GetClientRect() qui récupère le rectangle associé au bureau dans ton rect.
 
Je récapitule :
 
- Récupérer le hwnd du bureau (GetDesktopWIndow)
- initialiser un RECT
- récupérer le rectangle du bureau GetClientRect(hwnd, &RECT)
- InvalidateRect(hwnd, &RECT, True)

 

[jfdsdjhfuetppo]--Message édité par Harkonnen le 15-05-2002 à 12:24:14--[/jfdsdjhfuetppo]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2002 à 12:29:06    

Public Sub Refresh_Desktop()
    Dim hWnd As Long
    Dim recte As RECT
    Dim test As Long 'InvalidateRect(&clientrect);
     
     
    hWnd& = GetDesktopWindow()
    test = GetClientRect(hWnd, recte)
    Call InvalidateRect(hWnd, recte, 1)
 
End Sub
 
 
g vérifier il retourne bien la resulution de l'ecran ds recte, mais ca rafraichi po...


---------------
"Je brandirai une épée d'orichalque, je m'assouvirai sur des Templiers." | "Avec dans son sillage l'Ombre du Diable, Leirn appelait les morts pour une danse macabre et déchainaît les horreurs de la nuit..."
Reply

Marsh Posté le 15-05-2002 à 12:34:55    

J'y pense à l'instant....
 
C'est bien beau de faire un InvalidateRect, mais il faut redessiner le rectangle ensuite...
 
Essaie d'envoyer un message WM_PAINT au bureau ou utilise ValidateRect(hwnd, RECT) après le InvalidateRect
 
Je vais manger, a cet aprem  :hello:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2002 à 12:35:58    

me semblait bien kil y avait un mess, mais ke je savé pas encor el'envoyer ;)
 
bon app, je regarde ca


---------------
"Je brandirai une épée d'orichalque, je m'assouvirai sur des Templiers." | "Avec dans son sillage l'Ombre du Diable, Leirn appelait les morts pour une danse macabre et déchainaît les horreurs de la nuit..."
Reply

Marsh Posté le 15-05-2002 à 12:39:01    

deja validate rect marche po on essai les message...
 
c un sendnotifymessage le bon?


---------------
"Je brandirai une épée d'orichalque, je m'assouvirai sur des Templiers." | "Avec dans son sillage l'Ombre du Diable, Leirn appelait les morts pour une danse macabre et déchainaît les horreurs de la nuit..."
Reply

Marsh Posté le 15-05-2002 à 14:00:27    

ValidateRect() ne marche pas ?  :heink:  
 
Essaie d'envoyer un message au bureau alors...
 
SendMessage(hwnd,WM_PAINT,0,0)
 
Attention : tu devras définir dans ton source la valeur de WM_PAINT (je la connais pas, elle doit être dans le fichier windows.h si tu as un compilo C sous la main)
 
On va finir par y arriver a force... Si ça, ça ne marche pas, je sèche... :ouch:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2002 à 14:00:42    

Salut Leirn ;)
La je suis pas chez moi, mais de tete, passe le 3eme param en "ByRef lpRect As any", certains appels on besoin d'avoir un pointeur générique. Je jetterais un oeil chez moi si ca marche po mieux :)

Reply

Marsh Posté le 15-05-2002 à 14:01:30    

Au fait, tu passes bien une référence à RECT dans tes paramètres de fonction, et pas une RECT directement ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2002 à 14:02:38    

KarLKoX a écrit a écrit :

Salut Leirn ;)
passe le 3eme param en "ByRef lpRect As any"




grilled
 
les grands esprits se rencontrent  :D


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2002 à 15:16:43    

karl!!!!!
 
coocoo  :hello:  
 
ben je c pas encore ce ke je passe, je rentre de mon cours de physik, je m'y remet et je vous dit
 
apparement c byref par defo, et yavai pas byval, mais g rajouter byref par securité...

 

[jfdsdjhfuetppo]--Message édité par Leirn le 15-05-2002 à 15:20:02--[/jfdsdjhfuetppo]


---------------
"Je brandirai une épée d'orichalque, je m'assouvirai sur des Templiers." | "Avec dans son sillage l'Ombre du Diable, Leirn appelait les morts pour une danse macabre et déchainaît les horreurs de la nuit..."
Reply

Marsh Posté le 15-05-2002 à 15:17:48    

pour WM_PAINT et les valeurs des autres constantes, don't worry, api viewer


---------------
"Je brandirai une épée d'orichalque, je m'assouvirai sur des Templiers." | "Avec dans son sillage l'Ombre du Diable, Leirn appelait les morts pour une danse macabre et déchainaît les horreurs de la nuit..."
Reply

Marsh Posté le 15-05-2002 à 15:26:21    

bon, on reprend...
 
Type RECT
    left As Long
    top As Long
    right As Long
    bottom As Long
End Type
 
Public Declare Function GetDesktopWindow Lib "user32" () As Long
 
Public Declare Function InvalidateRect Lib "user32" _
                                (ByVal hWnd As Long,_
                                 ByRef lpRect As RECT,_
                                 ByVal bErase As Long) As Long
 
Public Declare Function GetClientRect Lib "user32" _
                                (ByVal hWnd As Long,_
                                 ByRef lpRect As RECT) As Long
 
Public Declare Function SendNotifyMessage Lib "user32" Alias "SendNotifyMessageA" _
                                (ByVal hWnd As Long,_
                                 ByVal msg As Long,_
                                 ByVal wParam As Long,_
                                 ByVal lParam As Long) As Long
 
Public Declare Function ValidateRect Lib "user32" _
                                (ByVal hWnd As Long,_
                                 lpRect As RECT) As Long
 
Public Const WM_PAINT = &HF
 
 
Public Sub Refresh_Desktop()
    Dim hWnd As Long
    Dim recte As RECT
    Dim test As Long
     
    hWnd& = GetDesktopWindow()
    test = GetClientRect(hWnd, recte)
    test = InvalidateRect(hWnd, recte, 1)
    test = ValidateRect(hWnd, recte)
    test = SendNotifyMessage(hWnd, WM_PAINT, 0, 0)
End Sub
 
 
 
 
 
 
 
kesky merde?


---------------
"Je brandirai une épée d'orichalque, je m'assouvirai sur des Templiers." | "Avec dans son sillage l'Ombre du Diable, Leirn appelait les morts pour une danse macabre et déchainaît les horreurs de la nuit..."
Reply

Marsh Posté le 15-05-2002 à 15:34:07    

C'est pas SendNotifyMessage, mais SendMessage()
 
Et si tu fais SendMessage(), pas besoin de faire ValidateRect() et vice-versa


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2002 à 15:53:57    

Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
 
 
Public Sub Refresh_Desktop()
    Dim hwnd As Long
    Dim recte As RECT
    Dim test As Long
     
     
    hwnd& = GetDesktopWindow()
    test = GetClientRect(hwnd, recte)
    test = InvalidateRect(hwnd, recte, 1)
    'test = ValidateRect(hWnd, recte)
    test = SendMessage(hwnd, WM_PAINT, 0, 0)
End Sub
 
 
 
pas plus  :(


---------------
"Je brandirai une épée d'orichalque, je m'assouvirai sur des Templiers." | "Avec dans son sillage l'Ombre du Diable, Leirn appelait les morts pour une danse macabre et déchainaît les horreurs de la nuit..."
Reply

Marsh Posté le 15-05-2002 à 15:56:15    

Je sèche......  :(  
 
Je testerais chez moi ce soir, car la je ne sais vraiment plus quoi faire....  :sweat:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2002 à 16:01:30    

moa pu non plus  :sweat:  :sweat:


---------------
"Je brandirai une épée d'orichalque, je m'assouvirai sur des Templiers." | "Avec dans son sillage l'Ombre du Diable, Leirn appelait les morts pour une danse macabre et déchainaît les horreurs de la nuit..."
Reply

Marsh Posté le 15-05-2002 à 16:35:38    

Si c'est utilisable depuis VB, y a bien l'API SHChangeNotify()
 
Exemple DELPHI mais y a qu'une ligne ..
http://www.scalabium.com/faq/dct0105.htm

Reply

Marsh Posté le 15-05-2002 à 16:45:41    

deja fait des tests avec, mais pas bcp plus de results....
 
 
je ressai


---------------
"Je brandirai une épée d'orichalque, je m'assouvirai sur des Templiers." | "Avec dans son sillage l'Ombre du Diable, Leirn appelait les morts pour une danse macabre et déchainaît les horreurs de la nuit..."
Reply

Marsh Posté le 15-05-2002 à 16:49:27    

C'est pas possible d'en chier comme ça pour un truc aussi con !! :heink:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2002 à 16:59:09    

je suis tout a fait d'accord avec toi... doit y avoir un truc ki merde, g oblier kke chose, je c pas koi...
 
enfin avec tt ce ke g testé devrait bien y en avoir un ki passe.... ou c ma version de win ki merde  :heink:


---------------
"Je brandirai une épée d'orichalque, je m'assouvirai sur des Templiers." | "Avec dans son sillage l'Ombre du Diable, Leirn appelait les morts pour une danse macabre et déchainaît les horreurs de la nuit..."
Reply

Marsh Posté le 15-05-2002 à 17:00:44    

je testerais chez moi ce soir


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed