Instabilité de la fonction keybd_event

Lokrakor Messages postés 5 Date d'inscription lundi 17 octobre 2011 Statut Membre Dernière intervention 28 octobre 2011 - 26 oct. 2011 à 15:47
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 28 oct. 2011 à 13:00
Bonjour à tous,

Je suis en train de développer un outil Excel et j'ai un problème avec la fonction "keybd_event"...

Je souhaiterais que lors du lancement de l'outil (après que l'utilisateur ait activé les macros) toutes les fenêtre se ferment et la userform se lance.

Tout se passe très bien grâce à la fonction "keybd_event" sauf dans certains cas, en particulier lorsque pas mal de fenêtres / logiciels / Pages internet... sont ouvertes.

Je pense à un problème de mémoire insuffisante pour tout traiter mais j'ai essayé pas mal de trucs et je ne sais pas si cela peut être corrigé ou si il existe une autre fonction qui éviterait cela!

Si vous pouvez m'aider je suis preneur! ;) Merci d'avance!

Le bug que l'outil fait lorsque je le lance rends mon bureaux comme ça :
http://www.pix-host.com/viewer.php?id=54888081.jpghttp://www.pix-host.com/allimages/54888081.jpg

Je vous écris par la suite le code que j'utilise :

' Déclaration des variables pour affichage du bureau avant de lancer l'outil
Private Declare Sub keybd_event Lib "user32" ( _
         ByVal bVk As Byte, _
         ByVal bScan As Byte, _
         ByVal dwFlags As Long, _
         ByVal dwExtraInfo As Long)

      Const KEYEVENTF_KEYUP = &H2
      Const VK_LWIN = &H5B


Private Sub CommandButton1_Click()

Application.Visible = False

' Réduire toutes les fenêtres et faire apparaitre la bureau (simulation du raccourci clavier Windows + M)
' 77 is the character code for the letter 'M'
 Call keybd_event(VK_LWIN, 0, 0, 0)
 Call keybd_event(77, 0, 0, 0)
 Call keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0)



Accueil.Show
End Sub

11 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
26 oct. 2011 à 17:03
Bonjour,

Déjà : nous ne voyons pas trop la nécessité d'utiliser cette fonction pour atteindre celà !
Si tu as des fenêtres à fermer, ferme-les donc en tuant leur processus (et en en étant totalement responsable, notamment du choix de ce que tu "zigouilles"), mais pas en simulant ainsi des touches !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Lokrakor Messages postés 5 Date d'inscription lundi 17 octobre 2011 Statut Membre Dernière intervention 28 octobre 2011
28 oct. 2011 à 09:34
Je me suis peut être mal exprimé puisque je ne souhaiterais pas fermer les fenetres mais les REDUIRE!

En fait, pour un soucis de clarté j'aimerais que l'outil se lance après être revenu automatiquement sur le bureau, d'où l'intéret du raccourci "Windows + M"
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
28 oct. 2011 à 09:52
Ma réponse est dans ce cas la même que celle que je t'avais déjà faite : ===>> ne pas agir sur les fenêtres à coup de simulations de touches, mais en utilisant leu(r handle.
Pour les réduire, tu peut par exemple utiliser la fonction SetWindowPlacement de la librairie user32 de l'API de Windows (apliquée au hwnd de la fenêt're à réduire).

Ceci étant dit, je suis assez surpris de ce que tu nous dis maintenant (souhait de réduire seulement et non plus de fermer), alors que dans ton premier message, on peut lire ceci :
Je pense à un problème de mémoire insuffisante

La réduction d'une fenêtre ne modifie rien à l'occupation en mémoire !
Pas vraiment limpide, ta demande.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
28 oct. 2011 à 10:16
En tout état de cause :
voilà une source déposée :
http://www.vbfrance.com/codes/REDUIRE-FENETRES-DANS-BARRE-TACHES-VB-NET_46985.aspx

Elle te montre comment, sous VB.Net, utiliser la fonction SetWindowPlacement pour une fenêtre connue.
N'en prends pas tout : le code dont il s'agit part du titre d'une fenêtre pour en rechercher le handle et l'utiliser ensuite.
Toi, part du seul handle, directement.
Il te faudra donc énumérer les fenêtres ouvertes (leur handle) et agir dessus

Il te faut donc utiliser (pour l'énumération) la fonction EnumWindows (également de la librairie User32).
La fonction Isiconic de l'api de Windows, utilisée dans cette énumération, te permettra de savoir si une fenêtre est déjà réduite (pour ne pas réduire ce qui l'est déjà)
Voilà.
Yapluka


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Lokrakor Messages postés 5 Date d'inscription lundi 17 octobre 2011 Statut Membre Dernière intervention 28 octobre 2011
28 oct. 2011 à 10:21
Merci de ta réponse rapide! ;)

Je ne savais pas que ça ne modifiait pas la mémoire... pourtant une fenêtre "mémoire insuffisante" est apparue lors du bug...

Je ne connait pas la fonction que tu as cité et je ne sais pas comment l'utiliser, pourrais-tu m'expliquer un peu plus?

Comment on pourrait le programmer par exemple?

La programmation n'est pas du tout mon coeur de métier donc je galère pas mal avec tout ce qui devient + technique!
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
28 oct. 2011 à 10:28
Je ne connait pas la fonction que tu as cité et je ne sais pas comment l'utiliser, pourrais-tu m'expliquer un peu plus?

Comment on pourrait le programmer par exemple?


Là, je te laisse faire ! (tu as un source, qui contient l'essentiel) et tu as par ailleurs le site de ALL-API.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Lokrakor Messages postés 5 Date d'inscription lundi 17 octobre 2011 Statut Membre Dernière intervention 28 octobre 2011
28 oct. 2011 à 10:29
Merci pour le lien je vais regarder! ;)
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
28 oct. 2011 à 10:50
Voici le Site de All-API. Tu y trouveras les fonctions dont je t'ai parlé, assorties d'exemples d'utilisation.
Il te faudra les combiner. Et ce devra être à toi de le faire.

S'il s'agit maintenant vraiment d'un problème de mémoire à rendre disponible, il ne suffira pas de réduire ! Il faudra véritablement fermer !
Fermer des applications ouvertes est cependant à mon sens une opération à ne pas lancer systématiquement et elle pourrait t'attirer les foudres des utilisateurs (c'est tellement évident !). C'est la raison pour laquelle je ne participerai certes pas à l'élaboration de ton mécanisme "dictatorial"
Je t'invite en ce qui me concerne à procéder d'une manière correspondant mieux àç l'éthique générale : ===>> inviter l'utilisateur à procéder lui-même à ces fermetures, en parfaite connaissance de cause (et notamment en sauvegardant ce qu'il veut sauvegarder).
Voilà !

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
28 oct. 2011 à 11:35
Mais d'autres questions se posent par ailleurs, compte tenu notamment des performances des machines, de nos jours.
En vrac :
- Quelle est la mémoire vive sur ta machine ?
- Quelle est la mémoire disponible avant lancement de ton appli ?
- Que devient cette mémoire disponible (sans rien fermer) immédiatement après lancement de ton appli ?

Question subsidiaire : le message "mémoire insuffisante" apparaît-il immédiatement ou en cours d'utilisation de ton appli ?
Voilà ce dont je me préoccuperais, personnellement, avant de fermer le clapet de toutes les applis autres que la mienne. Car il n'est pas impossible que le coeur réel du problème se trouve dans la tienne, d'appli



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Lokrakor Messages postés 5 Date d'inscription lundi 17 octobre 2011 Statut Membre Dernière intervention 28 octobre 2011
28 oct. 2011 à 12:03
Mais normalement cela ne devrait pas uiliser la mémoire comme ce que tu as dit précédemment puisque je ne cherche seulement qu'à réduire les fenêtre et non à les fermer?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
28 oct. 2011 à 13:00
Euh ...
Je crois que l'on est entré là dans une espèce de langage de sourds ...

Relis tout très attentivement, s'il te plait.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0