OVH Cloud OVH Cloud

Win Api32

4 réponses
Avatar
David Scime
Bonjour,

Je souhaite faire fonctionner une fonction de l'API Win32 qui est
AnimateWindow. Je déclare la fonction ainsi que ses flags:

<<
Private Declare Ansi Function AnimateWindow Lib "user32.dll" Alias
"AnimateWindow" ( _
ByVal hWnd As IntPtr, _
ByVal dwTime As Long, _
ByVal dwFlags As Long) As Integer

Const AW_HOR_POSITIVE As Long = &H1L
Const AW_HOR_NEGATIVE As Long = &H2L
Const AW_VER_POSITIVE As Long = &H4L
Const AW_VER_NEGATIVE As Long = &H8L
Const AW_CENTER As Long = &H10L
Const AW_HIDE As Long = &H10000L
Const AW_ACTIVATE As Long = &H20000L
Const AW_SLIDE As Long = &H40000L
Const AW_BLEND As Long = &H80000L

>>


J'essaye de l'utiliser à deux endroit dans mon code.. au load et à
l'appui d'un bouton..
voici mon code:

<<

Private Sub Form_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim b As Integer
b = Me.AnimateWindow(Me.Handle, 200, Me.AW_CENTER Or
Me.AW_ACTIVATE)
End Sub

Public Sub test()
Dim b As Integer = 4
b = Me.AnimateWindow(Me.Handle, 200, Me.AW_BLEND Or Me.AW_HIDE)
End Sub

>>

Malheureusement la fonction retourne toujours 0 et ne fonctionne donc
pas.. Qu'ais-je fais de pas correct?

David Scime

4 réponses

Avatar
Eric Vernié [MS]
Bonjour David,

Si tu veux savoir ce qui se passe, il te faut utiliser
Marshal.GetLastWin32Error() qui te permettra de retrouver l'erreur qu'AnimateWindows
Génère.
Mais avant de pouvoir l'utiliser il faut indiquer au système d'utiliser les
erreurs.
Or Declare n'est pas suffisant, utilise plutot l'attribut DllImport comme
ceci par exemple
<DllImport("user32.dll", EntryPoint:="AnimateWindow", _
SetLastError:=True, _
CallingConvention :ÊllingConvention.StdCall)> _
Public Shared Function AnimateWindow(ByVal hwnd As IntPtr, ByVal dwTime
As Long, ByVal dwFlags As Long) As Boolean
'Ne rien mettre ici
End Function

Ne pas oublier d'ajouter le Namespace : System.Runtime.InteropServices ;
GetLastWin32Error te retournes un entier, il te faut ensuite utiliser l'api
FormatMessage() pour retrouver la chaine de caractères du message :
<DllImport("Kernel32.dll", EntryPoint:="FormatMessageW", SetLastError:=True,
_
CharSet:=CharSet.Unicode,
CallingConvention:ÊllingConvention.StdCall)>
Public Shared Function FormatMessage(ByVal dwFlags As Integer, ByRef
lpSource As IntPtr, _
ByVal dwMessageId As Integer, ByVal dwLanguageId As Integer, ByRef
lpBuffer As [String], _
ByVal nSize As Integer, ByRef Arguments As IntPtr) As Integer
End Function


A+

Eric Vernié




"David Scime" a écrit dans le message de news:

Bonjour,

Je souhaite faire fonctionner une fonction de l'API Win32 qui est
AnimateWindow. Je déclare la fonction ainsi que ses flags:

<<
Private Declare Ansi Function AnimateWindow Lib "user32.dll" Alias
"AnimateWindow" ( _
ByVal hWnd As IntPtr, _
ByVal dwTime As Long, _
ByVal dwFlags As Long) As Integer

Const AW_HOR_POSITIVE As Long = &H1L
Const AW_HOR_NEGATIVE As Long = &H2L
Const AW_VER_POSITIVE As Long = &H4L
Const AW_VER_NEGATIVE As Long = &H8L
Const AW_CENTER As Long = &H10L
Const AW_HIDE As Long = &H10000L
Const AW_ACTIVATE As Long = &H20000L
Const AW_SLIDE As Long = &H40000L
Const AW_BLEND As Long = &H80000L

>>


J'essaye de l'utiliser à deux endroit dans mon code.. au load et à l'appui
d'un bouton..
voici mon code:

<<

Private Sub Form_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim b As Integer
b = Me.AnimateWindow(Me.Handle, 200, Me.AW_CENTER Or
Me.AW_ACTIVATE)
End Sub

Public Sub test()
Dim b As Integer = 4
b = Me.AnimateWindow(Me.Handle, 200, Me.AW_BLEND Or Me.AW_HIDE)
End Sub

>>

Malheureusement la fonction retourne toujours 0 et ne fonctionne donc
pas.. Qu'ais-je fais de pas correct?

David Scime


Avatar
David Scime
Eric Vernié [MS] a écrit :
Bonjour David,

Si tu veux savoir ce qui se passe, il te faut utiliser
Marshal.GetLastWin32Error() qui te permettra de retrouver l'erreur qu'AnimateWindows
Génère.
Mais avant de pouvoir l'utiliser il faut indiquer au système d'utiliser les
erreurs.
Or Declare n'est pas suffisant, utilise plutot l'attribut DllImport comme
ceci par exemple
<DllImport("user32.dll", EntryPoint:="AnimateWindow", _
SetLastError:=True, _
CallingConvention :ÊllingConvention.StdCall)> _
Public Shared Function AnimateWindow(ByVal hwnd As IntPtr, ByVal dwTime
As Long, ByVal dwFlags As Long) As Boolean
'Ne rien mettre ici
End Function

Ne pas oublier d'ajouter le Namespace : System.Runtime.InteropServices ;
GetLastWin32Error te retournes un entier, il te faut ensuite utiliser l'api
FormatMessage() pour retrouver la chaine de caractères du message :
<DllImport("Kernel32.dll", EntryPoint:="FormatMessageW", SetLastError:=True,
_
CharSet:=CharSet.Unicode,
CallingConvention:ÊllingConvention.StdCall)>
Public Shared Function FormatMessage(ByVal dwFlags As Integer, ByRef
lpSource As IntPtr, _
ByVal dwMessageId As Integer, ByVal dwLanguageId As Integer, ByRef
lpBuffer As [String], _
ByVal nSize As Integer, ByRef Arguments As IntPtr) As Integer
End Function


A+

Eric Vernié




"David Scime" a écrit dans le message de news:


Bonjour,

Je souhaite faire fonctionner une fonction de l'API Win32 qui est
AnimateWindow. Je déclare la fonction ainsi que ses flags:

<<
Private Declare Ansi Function AnimateWindow Lib "user32.dll" Alias
"AnimateWindow" ( _
ByVal hWnd As IntPtr, _
ByVal dwTime As Long, _
ByVal dwFlags As Long) As Integer

Const AW_HOR_POSITIVE As Long = &H1L
Const AW_HOR_NEGATIVE As Long = &H2L
Const AW_VER_POSITIVE As Long = &H4L
Const AW_VER_NEGATIVE As Long = &H8L
Const AW_CENTER As Long = &H10L
Const AW_HIDE As Long = &H10000L
Const AW_ACTIVATE As Long = &H20000L
Const AW_SLIDE As Long = &H40000L
Const AW_BLEND As Long = &H80000L



J'essaye de l'utiliser à deux endroit dans mon code.. au load et à l'appui
d'un bouton..
voici mon code:

<<

Private Sub Form_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim b As Integer
b = Me.AnimateWindow(Me.Handle, 200, Me.AW_CENTER Or
Me.AW_ACTIVATE)
End Sub

Public Sub test()
Dim b As Integer = 4
b = Me.AnimateWindow(Me.Handle, 200, Me.AW_BLEND Or Me.AW_HIDE)
End Sub


Malheureusement la fonction retourne toujours 0 et ne fonctionne donc
pas.. Qu'ais-je fais de pas correct?

David Scime








Je vais tenter cela.. bien le merci ;)
David Scime
Avatar
Eric Vernié [MS]
Bonjour David,

On ne sais jamais un fichier temporaire peut tres bien etre crée et ouvert.
Pour s'en apercevoir, il faut utiliser des outils tel que FileMon (File
Moniteur) dispo ici http://www.sysinternals.com/ntw2k/source/filemon.shtml
et vérifier que pour ton application il n'y a pas un truc qui se passe.

A+

Eric Vernié
Microsoft France


"David Scime" a écrit dans le message de news:

David Scime a écrit :
Eric Vernié [MS] a écrit :

Bonjour David,

Si tu veux savoir ce qui se passe, il te faut utiliser
Marshal.GetLastWin32Error() qui te permettra de retrouver l'erreur
qu'AnimateWindows Génère.
Mais avant de pouvoir l'utiliser il faut indiquer au système
d'utiliser les erreurs.
Or Declare n'est pas suffisant, utilise plutot l'attribut DllImport
comme ceci par exemple
<DllImport("user32.dll", EntryPoint:="AnimateWindow", _
SetLastError:=True, _
CallingConvention :ÊllingConvention.StdCall)> _
Public Shared Function AnimateWindow(ByVal hwnd As IntPtr, ByVal
dwTime As Long, ByVal dwFlags As Long) As Boolean
'Ne rien mettre ici
End Function

Ne pas oublier d'ajouter le Namespace : System.Runtime.InteropServices ;
GetLastWin32Error te retournes un entier, il te faut ensuite utiliser
l'api FormatMessage() pour retrouver la chaine de caractères du message
:
<DllImport("Kernel32.dll", EntryPoint:="FormatMessageW",
SetLastError:=True, _
CharSet:=CharSet.Unicode,
CallingConvention:ÊllingConvention.StdCall)>
Public Shared Function FormatMessage(ByVal dwFlags As Integer, ByRef
lpSource As IntPtr, _
ByVal dwMessageId As Integer, ByVal dwLanguageId As Integer,
ByRef lpBuffer As [String], _
ByVal nSize As Integer, ByRef Arguments As IntPtr) As Integer
End Function


A+

Eric Vernié




"David Scime" a écrit dans le message de
news:

Bonjour,

Je souhaite faire fonctionner une fonction de l'API Win32 qui est
AnimateWindow. Je déclare la fonction ainsi que ses flags:

<<
Private Declare Ansi Function AnimateWindow Lib "user32.dll" Alias
"AnimateWindow" ( _
ByVal hWnd As IntPtr, _
ByVal dwTime As Long, _
ByVal dwFlags As Long) As Integer

Const AW_HOR_POSITIVE As Long = &H1L
Const AW_HOR_NEGATIVE As Long = &H2L
Const AW_VER_POSITIVE As Long = &H4L
Const AW_VER_NEGATIVE As Long = &H8L
Const AW_CENTER As Long = &H10L
Const AW_HIDE As Long = &H10000L
Const AW_ACTIVATE As Long = &H20000L
Const AW_SLIDE As Long = &H40000L
Const AW_BLEND As Long = &H80000L



J'essaye de l'utiliser à deux endroit dans mon code.. au load et à
l'appui d'un bouton..
voici mon code:

<<

Private Sub Form_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim b As Integer
b = Me.AnimateWindow(Me.Handle, 200, Me.AW_CENTER Or
Me.AW_ACTIVATE)
End Sub

Public Sub test()
Dim b As Integer = 4
b = Me.AnimateWindow(Me.Handle, 200, Me.AW_BLEND Or Me.AW_HIDE)
End Sub


Malheureusement la fonction retourne toujours 0 et ne fonctionne donc
pas.. Qu'ais-je fais de pas correct?

David Scime









Je vais tenter cela.. bien le merci ;)
David Scime



C'est malheureux mais Marshal.GetLastWin32Error() me retourne le code
d'une erreur d'ouverture de fichier.. code 2
Alors que je n'utilise pas de fichier à ce niveau là..
J'appelle Marshal.GetLastWin32Error() juste après le AnimateWindow..
Je vais essayer d'approfondir le problème.. on verra bien..
Mais si vous avez une idée.. je suis bien sur preneur.. ;-)

David Scime



Avatar
Zoury
Salut !

voici quelques petits ajout au commentaire de d'Eric.

il ne faut pas oublier qu'en .NET les Long s'étendent sur 8 octets (64bits)
et non plus sur 4 octets comme en VB 6..

il faut donc adapter les déclarations comme ceci
'***
<DllImport("user32.dll", SetLastError:=True> _
Public Shared Function AnimateWindow( _
ByVal hwnd As IntPtr, _
ByVal dwTime As Int32, _
ByVal dwFlags As Int32) As Boolean
'Ne rien mettre ici
End Function
'***
il en est de même pour les constantes. ;O)


Aussi l'instruction "Alias" (lors d'un Declare) de même que le paramètre
EntryPoint (DllImport) ne sont pas nécessaire si la déclaration de la
fonction emploi le nom original (contenu dans le fichier .dll).

Ex :
' on emploi le nom original de la fonction se trouvant dans user32.dll
'***
<DllImport("user32.dll", SetLastError:=True> _
Public Shared Function AnimateWindow( _
ByVal hwnd As IntPtr, _
ByVal dwTime As Int32, _
ByVal dwFlags As Int32) As Boolean
'Ne rien mettre ici
End Function
'***

' on modifie le nom de la fonction
'***
<DllImport("user32.dll", SetLastError:=True, EntryPoint:="AnimateWindow"> _
Public Shared Function AnimerFenetre( _
ByVal hwnd As IntPtr, _
ByVal dwTime As Int32, _
ByVal dwFlags As Int32) As Boolean
'Ne rien mettre ici
End Function
'***
ou
'***
<DllImport("user32.dll", SetLastError:=True, EntryPoint:="AnimateWindow"> _
Public Declare Auto Function AnimerFenetre _
Lib "user32.dll" _
Alias "AnimateWindow" ( _
ByVal hwnd As IntPtr, _
ByVal dwTime As Int32, _
ByVal dwFlags As Int32) As Boolean
'***


--
Cordialement
Yanick
MVP pour Visual Basic