Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 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 | | Calendrier |
|
|
| Quelques fonctions de la user32.dll | |
| | Auteur | Message |
---|
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Quelques fonctions de la user32.dll Dim 11 Mai 2014 - 5:24 | |
| Salut tout le monde - Si vous voulez perdre votre temps, si vous n'avez rien de mieux à faire, CLIQUEZ ICI (vous êtes prévenus! :
- Code:
-
rem ============================================================================ rem Voici quelques fonctions de la user32.dll : ça peut servir. rem Sinon, connaitre simplement leur existence ne fait de mal à personne. rem Sinon, vous pouvez toujours les jetter à la poubelle ! rem ============================================================================ ' REMARQUE : Dans ces fonctions, le mot fenêtre est pris au sens de WINDOW, c-à-d ' Tout objet manipulé par WINDOW comme FORM, BUTTON, etc. dim ret%,hWnd,hWndParent,Flag, ascii
form 10 : set_focus 10 : left 10,300 button 20 : parent 20,10
hWnd = handle(0) print "handle(0) = " + str$(hWnd)
dll_on "user32.dll"
rem ============================================================================ rem GetForgroundWindow ' Cette fonction retourne un pointeur (Handle) vers la fenêtre qui se trouve ' au premier plan. ' Elle retourne 0 si aucune fenêtre n'est au premier plan (si un changement est en cours). ret% = dll_call0("GetForegroundWindow") print "Handle Forground = " + str$(ret%) rem ============================================================================ rem GetFocus ' Cette fonction retourne le handle de la fenêtre qui a le Focus ret% = dll_call0("GetFocus") print "Handle Focus = " + str$(ret%) print "Handle form 10 = " + str$(handle(10)) ret% = dll_call0("GetFocus") print "Handle Focus = " + str$(ret%) rem ============================================================================ rem GetDesktopWindow ' Cette fonction retourne le Handle de la fenêtre correspondant au bureau ' (Celle sur laquelle sont affichés le fond d'écran, et les icônes). ret% = dll_call0("GetDesktopWindow") print "Handle du Bureau = " + str$(ret%) rem ============================================================================ rem GetWindow ' retoure le handle de la fenêtre suivante (flag = 2)ou de la fenêtre précédente (flag = 3) flag = 2 : ' fenêtre suivante ret% = dll_call2("GetWindow",hWnd,flag) print "handle de la fenêtre suivante = " + str$(ret%) ' retoure le handle de la fenêtre précédente (flag = 3) flag = 3 : ' fenêtre précédente ret% = dll_call2("GetWindow",hWnd,flag) print "handle de la fenêtre précédente = " + str$(ret%) rem ============================================================================ rem GetParent ' Cette fonction retourne un pointeur (handle) vers la fenêtre parent dont ' le handle est passé en paramêtre. ' Si la fenêtre ne possède pas de parent, elle retourne 0. ret% = dll_call1("GetParent",handle(20)) print "Handle Parent de Button 20 = " + str$(ret%) rem ============================================================================ rem IsChild ' Cette fonction permet de savoir si une fenêtre est fille ou appartient à la ' descendance d'une autre. ' hWndParent est le handle de la fenêtre d'origine. ' hwnd est le handle de la fenêtre à tester. ' Si la seconde fenêtre fait partie de la descendance de la première la fonction ' retourne "1 = Vrai", sinon "0 = Faux". hWnd = handle(20) : ' handle du button 20 hWndparent = handle(10) : ' handle du form 10 ret% = dll_call2("IsChild",hWndParent,hWnd) if ret% > 0 print str$(hWndParent) + " est fils/fille de " + str$(hWnd) else print str$(hWndParent) + " n' est pas fils/fille de " + str$(hWnd) end_if rem ============================================================================ rem GetSystemMetrics ' Cette fonction est utile pour connaître les dimensions des objets manipulés sous Windows. ' Envoyez en paramêtre une constante (voir liste ci-dessous) et récupérez le résultat en pixels. ' 0 : Largeur de l'écran ' 1 : Hauteur de l'écran ' 2 : Largeur des barres de défilement verticales. ' 3 : Hauteur des barres de défilement horizontales. ' 5 : Largeur d'une bordure de fenêtre. ' 6 : Hauteur d'une bordure de fenêtre. ' 11 : Largeur d'un icône. ' 12 : Hauteur d'un icône. ' 13 : Largeur du curseur. ' 14 : Hauteur du curseur. ' 15 : Hauteur d'une barre de menu. ' 19 : Indique si une souris est présente (renvoie '1 = Vrai' ou '0 = Faux'). ' 20 : Hauteur des flèches dans les barres de défilement verticales. ' 21 : Largeur des flèches dans les barres de défilement horizontales. ' 23 : Indique si les boutons droit et gauche de la souris sont inversés (renvoie '1 = Vrai' ou '0 = Faux'). ' 36 : Largeur maximale à ne pas dépasser pour qu'un double-clic soit pris en compte. ' 37 : Hauteur maximale à ne pas dépasser pour qu'un double-clic soit pris en compte. ' 43 : Indique le nombre de boutons présents sur la souris. ret% = dll_call1("GetSystemMetrics",43) print "Votre souris possède " + str$(ret%) + " boutons" rem ============================================================================ rem IsCharAlphaA ' Cette fonction indique si un caractère est de type alphabétique (a-z,A-Z). ' Paramètre : code ASCII du caractère à tester. ' La fonction retourne 1 si le caractère est alphabétique, sinon 0. ascii = asc("a") ret% = dll_call1("IsCharAlphaA",ascii) if ret% > 0 print chr$(ascii) + " est alphabétique" else print chr$(ascii) + " n' est pas alphabétique" end_if rem ============================================================================ rem IsCharAlphaNumericA ' Cette fonction indique si un caractère est de type alphanumérique. ' Paramètre : code ASCII du caractère à tester. ' La fonction retourne 1 si le caractère est alphanumérique, sinon 0. ascii = asc("3") ret% = dll_call1("IsCharAlphaNumericA",ascii) if ret% > 0 print chr$(ascii) + " est alphanumérique" else print chr$(ascii) + " n' est pas alphanumérique" end_if rem ============================================================================ rem IsIconic ' Cette fonction permet de savoir si la fenêtre dont le handle est transmis en ' paramètre est réduite en icone ou non. ' La fonction retourne 1 si la fenêtre est réduite en icone, sinon 0. ret% = dll_call1("IsIconic",handle(0)) if ret% > 0 print "La fenêtre est réduite en inone" else print "La fenêtre n'est pas réduite en icone" end_if rem ============================================================================ rem IsWindowVisible ' Cette fonction permet de savoir si une fenêtre est visible ou non, ' même cachée par d'autres. ' Elle retourne '1 = Vrai' si la fenêtre est effectivement visible, sinon '0 = Faux'. ' ------------------------------------------------------------------------------ hide 20 : ' on cache le bouton ret% = dll_call1("IsWindowVisible",handle(20)) if ret% > 0 print "La fenêtre est visible" else print "La fenêtre n'est pas visible" end_if ' ------------------------------------------------------------------------------ show 20 : ' on montre le bouton ret% = dll_call1("IsWindowVisible",handle(20)) if ret% > 0 print "La fenêtre est visible" else print "La fenêtre n'est pas visible" end_if rem ============================================================================
dll_off rem ============================================================================
| |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Quelques fonctions de la user32.dll Dim 11 Mai 2014 - 7:29 | |
| Super boulot, j'achète !! Juste une petite remarque pour la compréhension: Pour la dernière fonction: IsWindowVisible, tu mets que c'est pour savoir si une fenêtre est visible ou non. Après tu fais le test sur un bouton masqué ou non et du coup l'exemple n'est pas très clair. En fait c'est par ce que les boutons utilisent une fenêtre au sens Windows, mais je pense qu'il faudrait l'expliquer car moi si Klaus (je crois) ne l'avait pas expliqué un jour, je ne suis pas sûr que j'aurais fait le rapprochement entre les boutons (ou autres objets) et les fenêtres. Je pense que je n'aurais pas était le seul... | |
| | | bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Quelques fonctions de la user32.dll Dim 11 Mai 2014 - 8:47 | |
| Bonjour à tous, J'ai étudié il y a quelques mois certaines fonctions de user32.dll. Papydall me donne la solution pour certaines fonctions que je n'avais pas saisies. Maintenant, je veux aussi apporter ma petite contribution: 1°) convertir code ascII majuscule en code ascII minuscule et vice versa, tout est dans le mémo du caractère chr$(0) à chr$(255). C'est bien du code 65 au 122 et du 192 au 255. - Code:
-
' convertir code ascII majuscule en code ascII minuscule et vice versa dim res%,i$,char% memo 1:full_space 1:bar_vertical 1:print_target_is 1 dll_on "user32.dll" for char%=0 to 255 res%=dll_call1("CharLowerA",char%) i$="code majuscule= "+str$(char%)+" ==> code minuscule= "+str$(res%)+" || " res%=dll_call1("CharUpperA",char%) i$=i$+"code minuscule= "+str$(char%)+" ==> code majuscule= "+str$(res%) print i$ next char% dll_off end
2°) connaître la longueur du caption de la fenêtre. Je sais qu'on peut l'avoir en panoramic pur avec len(caption$(0)). - Code:
-
' longueur du caption de la fenêtre dim res%,hnd% hnd%=handle(0) dll_on "user32.dll"
caption 0,"COUCOU" res%=dll_call1("GetWindowTextLengthA",hnd%) message res%
caption 0,"PANORAMIC" res%=dll_call1("GetWindowTextLengthA",hnd%) message res%
dll_off end
et un 3°) que je trouve très intéressant: faire flasher une fenêtre window: - Code:
-
' faire clignoter la fenêtre label flash dim res%,hnd% hnd%=handle(0) button 1:caption 1,"Flash window":on_click 1,flash button 2:caption 2," Stop Flash ":left 2, width(1)+10 dll_on "user32.dll" end
flash: off_click 1 repeat res%=dll_call2("FlashWindow",hnd%,1) wait 250 until clicked(2)=1 on_click 1,flash return
Voilà, à+ | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Quelques fonctions de la user32.dll Dim 11 Mai 2014 - 13:21 | |
| Bonjour tout le monde. Je vois qu’il y a de la visite sur ce post, bien que j ‘ai prévenu que c’est … bon à savoir ! - Jicehel a écrit:
- Super boulot, j'achète !! Juste une petite remarque pour la compréhension: Pour la dernière fonction: IsWindowVisible, tu mets que c'est pour savoir si une fenêtre est visible ou non. Après tu fais le test sur un bouton masqué ou non et du coup l'exemple n'est pas très clair. En fait c'est par ce que les boutons utilisent une fenêtre au sens Windows, mais je pense qu'il faudrait l'expliquer car moi si Klaus (je crois) ne l'avait pas expliqué un jour, je ne suis pas sûr que j'aurais fait le rapprochement entre les boutons (ou autres objets) et les fenêtres. Je pense que je n'aurais pas était le seul...
Les boutons n’utilisent pas une fenêtre au sens WindowsLes boutons et tous les autres objets sont des FENETRES au sens Windows.FORM, BUTTON, ALPHA, EDIT, COMBO, TIMER, etc .. sont des fenêtres au sens Windows ! Dans le code posté ci-haut, j’ai indiqué qu’un bouton (par exemple) est une fenêtre pour Windows. Un autre exemple de FlashWindow - Code:
-
rem ============================================================================ rem Faire clignoter la barre de menu de la fenêtre rem ============================================================================ dim ret%, hwnd%,i%,oui% form 10 : top 10,150 : left 10,100 : caption 10,"Je clignote !" color 10,0,255,255 hwnd% = handle(10) oui% = 1 : ' = 0 --> ne pas clignoter , non 0 --> clignoter dll_on "user32.dll" for i% = 1 to 50 ret% = dll_call2("FlashWindow",hwnd%,oui%) : wait 50 next i% dll_off caption 10,"Je ne clignote plus !" rem ============================================================================
Certains API demandent comme paramètre une structure, Or sous PANORAMIC, il n’est pas possible de définir de tels types. Voici le problème : Comme exemple, je prends la fonction GetCursorPos de la user32.dll qui retourne la position du curseur : les coordonnées sont renvoyées sous forme d’une structure POINTAPI définie comme ceci : Type POINTAPI X : entier long Y : entier long End Type L’appel de la fonction se fait comme ceci : Ret% = dll_call1(« GetCursorPos »,paramètre de type POINTAPI) Ma question : quelqu’un a -t-il une idée pour faire ça en Panoramic ? J’ai tenté de passer deux paramètres X et Y par leur adresse mais ça a échoué. En VB - Code:
-
Private Declare Function GetCursorPos Lib "user32" ( _ lpPoint As POINTAPI) As Long
Private Type POINTAPI X As Long Y as Long End Type
Dim Tampon As POINTAPI GetCursorPos Tampon ' La position du curseur se trouve dans : ' Tampon.X et Tampon.Y
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Quelques fonctions de la user32.dll Dim 11 Mai 2014 - 19:20 | |
| Voici comment on fait. La réponse est dans les commentaires du code ci-dessous: - Code:
-
' Private Declare Function GetCursorPos Lib "user32" ( _ ' lpPoint As POINTAPI) As Long ' ' Private Type POINTAPI ' X As Long ' Y as Long ' End Type ' ' Dim Tampon As POINTAPI ' GetCursorPos Tampon ' La position du curseur se trouve dans : ' Tampon.X et Tampon.Y ' ' pour simuler cela, on n'a pas d'autre moyen que de passer une chaîne ' de caractères de 2*n octets. Extrait de la doc Visual Basic: ' Holds signed 64-bit (8-byte) integers ranging in value ' from -9,223,372,036,854,775,808 through 9,223,372,036,854,775,807 ' (9.2...E+18) ' Donc, pour un système 64 bits en mode natif, il faut 2*8 octets. ' Pour un système 32 bits, il faut 2*4 octets. ' ' Le premier octet de la chaîne contient l'octet de poids le plus faible ' de la valeur entière, etc. Voici le schéma pour un système 32 bits: ' | x0..7 | x8..15 | x16..23 | x24..31 | y0..7 | y8..15 | y16..23 | y24..31 | ' On peut y arriver avec une simple procédure qui masque, en boucle, ' les 4 fois 8 bits de chaque entier par BIN_AND, puis shift à droite ' pour produire un résultat entre 0 et 255, puis attacher chr$(code caracère) ' à la chaîne résultante. ' ' Ensuite, il ne reste plus qu'à passer adr(chaine$) à ' dll_call1("SetCursorPos",adr(chaine$)). ' ' Pour GetCursorPos, suivre la procédure inverse: définir une chaîne de ' 8 caractères par string$(8,"x") ou string$(8,chr$(0)), passer cette adresse ' à dll_call1("GetCursorPos",adr(chaine$)). Ensuite, décoder ma chaîne ' caractère par caractère, pour reconstruire des deux valeurs entières. ' ' KGF_SUB contient des procédures gérant cela de façon beaucoup plus élégante. ' Regarde la rubrique "Gestion des fichiers binaires". ' La ligne "Définition d'un enregistrement", il y a la documentation ' des quelques procédures contenues dans KGF_SUB.bas pour définir et créer ' un enregistrement binaire. C'est exactement ce qu'il faut ici, avec ' deux champs I4. Puis, il y a les fonctions CopyBinaryStringToRecord ' et CopyRecordToBinaryString pour la manipulation de ces objets.
' A titre d'exemple, voici comment on définit un tel record: dim X%, Y% : ' les deux variables pour la fonction DLL dim res%, a8$ define_record(2) : ' définir un champ de 2 enregistrements add_integer_field(adr(X%)) : ' ajouter un champ I4 add_integer_field(adr(Y%)) : ' ajouter un champ I4 build_record() : ' construire le record
' récupérer la position du curseur: a8$ = string$(8,"x") : ' réserver l'espace res% = dll_call1("GetCursorPos",adr(a8$)) : ' appeler la DLL CopyBinaryStringToRecord(a8$) : ' décoder le résultat message "X="+str$(X%)+" Y="+str$(Y%)
' forcer la position du curseur: X% = 210 Y% = 180 a8$ = string$(8,"x") : ' réserver l'espace CopyRecordToBinaryString(a8$) : ' charger le record res% = dll_call1("SetCursorPos",adr(a8$)) : ' appeler la DLL
#INCLUDE "KGF_SUB.bas"
' les procédures de définition du record fonctionnent sans KGF.dll. ' Elles sont 100% Panoramic et entièrement contenues dans KGF_SUB.bas. ' Par contre, les procédures CopyBinaryStringToRecord et CopyRecordToBinaryString ' font appel à une fonction de KGF.dll. Il faut donc jongler avec les DLLs, ' ou mieux, utiliser les fonctions de chargement dynamique d DLLs dans KGF.dll ' pour charger USER32.dll, à l'insu de Panoramic.
| |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Quelques fonctions de la user32.dll Dim 11 Mai 2014 - 19:35 | |
| Bravo Klaus. Je verrais ça tout à l'heure en détail. Merci et à + | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Quelques fonctions de la user32.dll Dim 11 Mai 2014 - 23:14 | |
| - Éclaircissement:
Fenêtre : Du point de vue Windows, tout ce qui est à l'écran est une fenêtre ! Ainsi tous les objets affichables sont des fenêtres : la barre de tâche, un bouton, un cadre image, un écran, une case à cocher, une barre d'outil, le bureau de Windows, une fenêtre , une bulle d'aide, un menu, une jauge, une zone de saisie de texte, .........Toutes ces fenêtres sont agencées en une gigantesque arborescence, car une fenêtre possède une fenêtre "parent" (de laquelle elle ne peut pas sortir), et peut posséder des fenêtres "enfants". Toutes ces fenêtres sont identifiées de manière unique par leur hWnd. Notez que la fenêtre écran ne possède pas de parent, car il s'agit de la "racine". Handle :Sorte de "pointeur" qui fait référence à un objet. En fait, il s'agit simplement d'un entier de 32bits ; Si vous envoyez ce nombre à une Api qui attend un handle, cette Api interprétera ce nombre comme une référence à un objet : il peut s'agir d'une fenêtre, d'une région, d'une image, d'un process, d'une icône, d'un menu ... Cela permet au système d'identifier de manière unique chacun de ces objets. hWnd : C'est le petit nom d'un "handle d'une fenêtre" (handle Window). Il s'agit d'un entier de 32bits qui identifie de manière unique une fenêtre. hDC :Signifie "handle d'un contexte d'affichage" (handle Device Context). Il s'agit d'un objet capable d'afficher du graphisme. Il pourra aussi bien désigner un cadre image qu'un écran, une imprimante, et tout objet dans lequel vous pouvez utiliser des routines graphiques. Là encore, à chaque fois que vous voudrez dessiner dans une fenêtre, vous aurez besoin de son hDC.
| |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Quelques fonctions de la user32.dll Dim 11 Mai 2014 - 23:46 | |
| Serieux là Papydall, tu as vraiment tout pour faire un bon article. Un peu de théorie sur l'usage des DLL Windows + Explications + Vocabulaire Mise en pratique avec quelques fonctions simples puis avec des fonction plus complexes (avec l'explication fournie par Klaus pour simuler les structures et la mise en pratique dans un petit code "simple") Qu'en penses-tu ? En plus ça permettrait de garder une trace de ce travail et que les futurs utilisateurs de Panoramic le retrouvent facilement. | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Quelques fonctions de la user32.dll Dim 11 Mai 2014 - 23:53 | |
| Bin woui, moi aussi j'apprends. Pour l'article pourquoi pas, quand je dompterai mieux la bête! | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Quelques fonctions de la user32.dll Lun 12 Mai 2014 - 7:50 | |
| OK, je n'avais pas remarqué que tu ne l'avais pas dompté .... | |
| | | Contenu sponsorisé
| Sujet: Re: Quelques fonctions de la user32.dll | |
| |
| | | | Quelques fonctions de la user32.dll | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |