berka Admin
Nombre de messages : 842 Age : 33 Localisation : Devant mon ordi! Projet en cours: : Secret ^^ Date d'inscription : 16/03/2007
niveau du maker mapping: (0/100) events: (50/100) scriptage: (100/100)
| Sujet: les APIs windows ! Sam 3 Mai - 22:27 | |
| Ce tutoriel n'est destiné qu'à des utilisateurs du ruby/ rgss confirmés, étant donné sa difficulté. (je ne veux décourager personne) J'essaye de le faire le plus simple possible, peut etre au détriment de son exhaustivité... Tout d'abord, qu'est-ce qu'une api windows ? C'est un moyen très direct d'agir, de controler le systeme d'exploitation windows. Et bien sur, cela nous interresse très fortement pour personnaliser notre jeu ! Windows (ouh qu'il est gentil) nous offre donc plusieurs types d'apis, presentes dans le dossier d'installation de l'OS windows, sous forme de dlls, Dynamic Link Library. en voici les principales et les plus utilisées: (pour windows 32 bits, pour XP, je ne connais pas encore très bien vista) user32.dll interface utilisateur: etat du clavier, souris ... kernel32.dll gere les periferiques: imprimante, et permet de modifier la base de registre... shell32.dll reseau, redemarrer, quitter windows ... gdi32.dll affichage: ecran... comctl32.dll affiche des elements de controle: progressbar, barres d'outils... comdlg32.dll boites de dialogue: manipulation de fichiers... winmm.dll gestion multimedia, implantée a windows
mais cette liste est loin d'etre complete, etant donné toutes les possibilités qu'offrent les apis. passons maintenant a leur utilisation: RGSS possède bel et bien une classe, nommée Win32API, gerant l'importation de dlls. interressons nous a un code très court, permmetant d'emuler une combinaison de touches: - Code:
-
@clavier = Win32API.new(user32.dll', 'keybd_event', ['i', 'i', 'l', 'l'], 'v')
- on assigne a une variable @ clavier toute l'api:
- on appelle la classe Win32API, avec comme arguments ceci: (user32.dll', 'keybd_event', ['i', 'i', 'l', 'l'], 'v')
- user32.dll : nom de la dll
- keybd_event : fonction de la dll (en effet la dll user32 est comme une boite, regroupant de nombreuses fonctions comme keybd_event, SetCursorPos etc...)
- ['i', 'i', 'l', 'l'] ou %w(i i l l) (meme chose): plus compliqué: on crees un tableau comportant tous les parametres a entrer dans la focntion de la dll, on y reviendra...
- 'v', la sortie de l'api, on y reviendra aussi...
ceci: @clavier = Win32API.new(user32.dll', 'keybd_event', ['i', 'i', 'l'], 'v') ne nous sert a rien pour l'instant, ce n'est qu'une variable, il faut l'appeler pour qu'elle agisse sur le systeme: on fait donc ca: - Code:
-
@clavier.call(0xA4, 0, 2) ces 4 arguments (0xA4, 0, 2) renvoient à ces 4 parametres ['i', 'i', 'l'] gné, pourquoi des i et des l ? ben il faut faire de l'anglois
- i = integer, c'est un entier, commme 1, 5, 123, 34453 ...
- l = long, c'est un nombre: 155,552, 542,458888, 1,00
il existe aussi:
- p = texte, contiendra un string (c'est un pointeur...)
- v = void type, variable reservée a la sortie, donc au dernier argument de @clavier = Win32API.new(user32.dll', 'keybd_event', ['i', 'i', 'l'], 'v')
donc: @clavier.call(0xA4, 0, 2) 0xA4: numero de la touche 0 : "code matériel d'analyse" 2; etat de la touche (pressée ou pas) par contre d'une dll a l'autre, ou meme d'une fonction d'une dll a l'autre les arguments changent exemples: @readini = Win32API.new('kernel32', 'GetPrivateProfileStringA', %w(p p p p l p), 'l') @findwindow = Win32API.new('user32', 'FindWindowA', %w(p p), 'l') @desktop = Win32API.new("user32", "SystemParametersInfo", ['L','L','P','L'] , 'L') ... ... mais comment trouver le nombre d'arguments et de parametres, ainsi que leur forme ? il n'y a pas d'autres moyens que de faire une recherche sur le web je vous conseille le site de microsoft: msdn2 et ce site très complet: allapisvoici un p'tit script d'exemple necessite cette dll ici memecar avec les apis, on peut meme importer ses propres dlls, placées au prealable dans son projet - Spoiler:
- Code:
-
module Fond_d_ecran_Berka @screen = Win32API.new 'screenshot', 'Screenshot', %w(l l l l p l l), '' # dll de capture d'ecran @readini = Win32API.new 'kernel32', 'GetPrivateProfileStringA', %w(p p p p l p), 'l' # dll de lecture d'un fichier @findwindow = Win32API.new 'user32', 'FindWindowA', %w(p p), 'l' # dll pour trouver la position de la fenetre a traiter @desktop = Win32API.new("user32", "SystemParametersInfo", ['L','L','P','L'] , 'L') # dll changeant le papier peint du bureau module_function def shot(file = "Screen", type = 0) if type == 0 typname = ".bmp" end dir = "" file_name = dir+file.to_s+typname.to_s @screen.call(0,0,640,480,file_name,handel,type) # on appelle le handel (position de la fenetre) puis on capture le contenu de la fentre de jeu, on enrgistre l'image sous .\\Screen.bmp @desktop.Call(20,0,".\\Screen.bmp",0) # on attibue l'image .\\Screen.bmp comme papier peint print ("Retournez voir votre Bureau maintenant ! ") end def handel game_name = "\0" * 256 #on creer un string de 256 caracteres qui contiendra le titre du projet @readini.call('Game','Title','',game_name,255,".\\Game.ini") #on lit le fichier Game, a la ligne où est inscrit Title, on ecrit cette ligne dans la variable game_name game_name.delete!("\0") return @findwindow.call('RGSS Player',game_name) end end
autre exemple: - Spoiler:
- Code:
-
begin MessageBox = Win32API.new('user32', 'MessageBox', %w(p p p i), 'i') choix = MessageBox.call(0, "bonjour rmvx \n voici un exemple des possibilites des apis\n j'espere que vous avez compris mon tuto", "berka", 49) if choix == 1 MessageBox.call(0, "parfait", "berka", 0) else MessageBox.call(0, "on recommence...", "berka", 0) end end
voila, en espérant avoir été le plus clair possible ! | |
|