IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Comment liberer la mémoire vive svp ?


Sujet :

Windows Forms

  1. #1
    Membre très actif Avatar de arnofly
    Homme Profil pro
    Développeur Web / Webdesigner
    Inscrit en
    Mai 2007
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web / Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 413
    Par défaut Comment liberer la mémoire vive svp ?
    Bonjour,

    J'ai fait un petit programme pour arreter plusieurs processus de Windows afin de liberer la RAM d'une vielle bécane. Explorer est inlcu ds les process que je stop. Pour relancer les process précédements arretés en un click de souris, mon programme ne se ferme pas à la fin de toute la procédure, mais ouvre une autre form qui propose de relancer les processus arrétes. Le problème est que mon prog occupe alors 13 Mo de RAM.

    Je suis débutant, mais il me semble que la solution soit du coté d'une commande nommée "Dispose()"
    Malheuresement, je ne sais pas comment l'utiliser...

    Donc, un petit coup de main svp pour finir mon prog serait le bien venu.
    Merci d'avance.
    A+

  2. #2
    Membre Expert Avatar de LaChips
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 109
    Par défaut
    Bonjour,
    La méthode .Dispose() est utilisé au moment ou tu détruis un objet instancié, afin de libérer la mémoire qu'il utilise.
    Tu dois appeler cette méthode quand tu n'utilises plus un objet de ton programme...

  3. #3
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    pour 10 euros t'as 512Mo de ram sur ebay
    c'est plus simple que de faire l'apprenti sorcier à tuer les processus


    sinon pour dispose, c'est une fonction qui existe sur pas mal d'objets du framework enfin sur ceux qui utilisent des ressources non managées, de l'OS par exemple

    il est fortement conseillé d'appeler la méthode dispose sur tous les objets la possédant
    par exemple sur une fenetre, si tu instancie un New Image et que tu fermes ta fenetre, l'objet a de forte chance de rester en mémoire longtemps

    j'avais fait un programme de test, avec un timer qui faisait un new system.Drawing.bitmap (500,500) toutes les 500ms
    et résultat au bout de quelques secondes, mon prog occupait 800Mo de ram

    pour les fenetre dispose est appelé automatiquement, et au passage la fenetre appelle dispose sur tous ses controles qui appelent dispose sur tous leurs controles

    donc là ou tu peux gagner c'est sur tes objets dans ton code
    donc au moment de désinstancier un objet, il faut que tu tapes le code qui désinstancie les objets qu'il a créé
    il est parfois possible d'overrider Dispose(disposing as boolean) et de mettre son code de desinstanciation puis de rappeler mybase.Dispose
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    il ne faut pas non plus oublier qu'il y a le GC ( ramasse miettes ) qui fait son petit ménage des objets non utilisés de manière aléatoire. On ne peut pas affirmer avec certitudes qu'après un Dispose l'objet managé ai véritablement libéré la mémoire qu'il utilisait ( pour les resources natives ça marche, mais pour un byte[] de 8 Mo par exemple ça ne marchera pas ) celà conduit parfois a des situations tordues : par exemple, on lance un programme WinForm simple, il occupe 50 Mo, on le réduit dans la barre des taches : 8 Mo, on le restore 13 Mo ...
    Tu peut donc éssayer GC.Collect() pour forcer le GC à faire le ménage tout de suite mais là encore c'est assez complexe de savoir quelles seront les objets qui seront effectivement supprimés ...

  5. #5
    Membre très actif Avatar de arnofly
    Homme Profil pro
    Développeur Web / Webdesigner
    Inscrit en
    Mai 2007
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web / Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 413
    Par défaut
    pourais-tu me donner un exemple stp ? y'a pas mieux pour comprendre je trouve.

    Sinon, j'ai essayé d'ajouter la commande "Dispose()" mais ça ne change de rien. A l'évidence, je ne l'utilise pas correctement. En exemple, un bout de mon code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    Private Sub Button_Optimiser_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_Optimiser.Click
            Me.DialogResult = System.Windows.Forms.DialogResult.OK
     
            Button_Optimiser.Enabled = False
            Button_Optimiser.BackColor = Color.Empty
            Button_Fermer.Enabled = False
            Button_NormalConfig.Visible = False
            Button_ExplorerSTART.Visible = False
     
            Label_EnCours.Visible = True
            Label_Optimiser.Visible = False
     
            Dim TerminerProcessus() As Process = Process.GetProcesses 'récupère la liste des processus de Windows (Attention, ce sont des tableaux)
            For x As Integer = 0 To UBound(TerminerProcessus) 'Recherche ds la liste (en boucle)
     
                If TerminerProcessus(x).ProcessName.ToString = "cmd" Then
                    TerminerProcessus(x).Kill()
                End If
     
                ' TouchPad ----------------------------------------------------
                If TerminerProcessus(x).ProcessName.ToString = "Apoint" Then
                    TerminerProcessus(x).Kill()
                End If
                If TerminerProcessus(x).ProcessName.ToString = "ApntEx" Then
                    TerminerProcessus(x).Kill()
                End If         
                ' et les autres process...
            Next
     
            TimerOptimiser.Interval = (15000)
            TimerOptimiser.Start()
        End Sub
     
    Private Sub TimerOptimiser_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerOptimiser.Tick
     
            Shell("cmd.exe /k taskkill /F /IM explorer.exe", AppWinStyle.Hide)
     
            System.Threading.Thread.Sleep(3000) ' y'a pas mieux pour attendre la fin ?
     
            Dim TerminerProcessus() As Process = Process.GetProcesses
            For x As Integer = 0 To UBound(TerminerProcessus)
                If TerminerProcessus(x).ProcessName.ToString = "cmd" Then
                    TerminerProcessus(x).Kill()
                End If
            Next
     
            TimerOptimiser.Stop()
     
            System.Threading.Thread.Sleep(3000)
     
            'Me.WindowState = FormWindowState.Normal
     
            Button_Optimiser.Dispose()
            Button_NormalConfig.Dispose()
            Button_ExplorerSTART.Dispose()
            Button_Fermer.Dispose()
            Panel_Buttons.Dispose()
            Panel_Labels.Dispose()
     
            'Me.Dispose()
     
            'My.Application.ApplicationContext.MainForm.Dispose()
            'Me.Finalize
            FormMini.Show()
            Me.Close()
        End Sub

  6. #6
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Citation Envoyé par arnomedia
    Shell("cmd.exe /k taskkill /F /IM explorer.exe", AppWinStyle.Hide)

    System.Threading.Thread.Sleep(3000) ' y'a pas mieux pour attendre la fin ?
    Oui, utilise plutot les fonctions de la class System.Diagnostics.Process. Il y a une méthode WaitBidule pour attendre la fin de l'exécution d'un programme.


    Citation Envoyé par arnomedia
    Button_Optimiser.Dispose()
    Button_NormalConfig.Dispose()
    Button_ExplorerSTART.Dispose()
    Button_Fermer.Dispose()
    Panel_Buttons.Dispose()
    Panel_Labels.Dispose()
    Essaye de rajouter GC.Collect() après ...

  7. #7
    Membre très actif Avatar de arnofly
    Homme Profil pro
    Développeur Web / Webdesigner
    Inscrit en
    Mai 2007
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web / Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 413
    Par défaut
    pour les RAM à pas cher sur e-bay, oui peut etre ? mais c pas trop le but. Disons que ce prog est un pretexte pour continuer à apprendre le VB

    En tout cas merci pour vos réponse. Par contre, si qqc pouvait me donner un exemple... car je ne maitrise pas bien le vocabulaire spécifique et du coup, je n'ai pas tout compris.

  8. #8
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    deja j'ai dit que la fenetre s'occupait de disposer ses controles donc pas besoin de le faire toi meme avant
    GC = garbage collector
    c'est un processus en tache de fond qui s'occupe de libérer la mémoire quand ca le chante
    dans une grande appli qui tourne pendant des heures sur un pc avec plein de ram, ne pas faire GC.collect pendant que l'utilisateur est devant, sinon il sera pas trop content

    sinon apprendre vb avec un programme dans ce genre n'est pas le mieux je pense
    tu peux apprendre par ici : http://plasserre.developpez.com/vsommair.htm
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre très actif Avatar de arnofly
    Homme Profil pro
    Développeur Web / Webdesigner
    Inscrit en
    Mai 2007
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web / Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 413
    Par défaut
    je consulte ce lien régulièrement, c 'est une mine d'or pour moi ! merci qd m. Sinon, j'en suis à mon 3eme petit prog et je compte bien terminer celui-ci, d'autant que cette difficulter devrait etre la dernière que je rencontre pour ce prog puisqu'il est "terminé".

    Donc, un exemple ?

  10. #10
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    un exemple de ?

    si ton programme n'a qu'une fenetre tu ne pourras rien gagner
    il est possible de libérer de la mémoire quand on ouvre et qu'on referme des fenetre en gros (enfin des classes)
    10 ou 15 Mo c'est pas grand chose
    après tu peux gagner si tu fais pas de fenetre, mais juste du code
    tu peux nous mettre ton code si tu veux qu'on jette un oeil

    autre chose sur le dispose si tu écris une classe n'héritant de rien, et que tu veux te faire un dispose il faut faire gc.supressfinalize me dedans
    et implémenter IDisposable
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  11. #11
    Membre très actif Avatar de arnofly
    Homme Profil pro
    Développeur Web / Webdesigner
    Inscrit en
    Mai 2007
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web / Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 413
    Par défaut
    oui merci. je suis justement entrain de consulter le cours de plasserre où il explique un peu le principe du "dispose()" mais ça n'est pas tres clair pour moi. si jai bien compris, la mememoire ne sera pas forcément libérée de suite. Finalement, je vais peut-etre essayer autre chose... Pourtant fermer une form et en ouvrir une autre, tres tres legère, en mimimized ne devrait pendre ke qq ko, non ?

  12. #12
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    private sub
    dim a as new machin
    end sub

    sur un objet normal il est passé à nothing
    sur un objet non managé il ne l'est pas

    dans les 1er cas, le garbage collector en voyant l'objet va le manger
    dans le 2eme cas il va voir que personne ne le connait et va le marquer comme mangeable, donc ne sera pas supprimé sur ce passage de GC (au 3eme passage en fait)

    le probleme c'est que le GC n'est pas appelé hyper souvent, et il mange ce qu'il a envie de manger
    en fait c'est l'OS qui le presse quand il a besoin de mémoire

    sur une machine avec 2Go de ram, le gc va dormir jusqu'a que l'appli prenne des centaines de Mo de ram et la l'OS va dire au gc de réduire l'appli
    donc il va passer énormément de temps à tout manger

    sur dispose d'un petit objet des fois il va rien faire et sur certains gros objets, comme les fenetre il va se dire que ca vaut le coup de manger tout de suite

    tout ce qu'on peut faire c'est disposer soit meme pour qu'en qu'a de besoin le GC sache directement qu'il peut manger
    mais sinon il fait bien ce qu'il veut et la gestion de la mémoire est gérée de manière autonome, et les machines aujourd'hui ont 1 ou 2 Go de ram
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  13. #13
    Membre très actif Avatar de arnofly
    Homme Profil pro
    Développeur Web / Webdesigner
    Inscrit en
    Mai 2007
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web / Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 413
    Par défaut
    C tout de suite plus clair comme ça merci.

    Le PC à qui est destiné ce prog n'a que 256 Mo de RAM dont 16 pour la vidéo partagée. Sinon, dans l'idéal, il faudrait que je puisse créer un "raccourci" dans mon code. Comme ça, je pourais fermer mon prog et liberer la ram.

    ça donnerait ça en gros :

    Creer un nouveau fichier (éxecutable sans WindowsForm)
    Ecrire ds le nouveau fichier avec (StreamWriter)
    If... j'appuis sur Ctrl+Alt+S Then...
    Process.Start(Path pour relancer mon prog)
    End If
    Process.Start(Path le nouveau fichier de code qui ne devrait apparaitre que ds les services de Windows)
    Me.Close (qui ferme mon prog et libère donc la RAM)

    C possible ?

  14. #14
    Membre très actif Avatar de arnofly
    Homme Profil pro
    Développeur Web / Webdesigner
    Inscrit en
    Mai 2007
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web / Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 413
    Par défaut
    Sans succès, je vais essayer autre chose.

  15. #15
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Citation Envoyé par arnomedia Voir le message
    If... j'appuis sur Ctrl+Alt+S Then...
    Process.Start(Path pour relancer mon prog)
    End If
    Process.Start(Path le nouveau fichier de code qui ne devrait apparaitre que ds les services de Windows)
    Me.Close (qui ferme mon prog et libère donc la RAM)

    C possible ?
    OUi c'est possible en récupérant les codes des touches du clavier
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  16. #16
    Membre très actif Avatar de arnofly
    Homme Profil pro
    Développeur Web / Webdesigner
    Inscrit en
    Mai 2007
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web / Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 413
    Par défaut
    Slt Aspic !

    Contents que tu jettes un oeil à mon problème. Je suis completement bloqué. On m'a parlé de la fonction RegisterHotKey() mais je ne sais abosolument pas comment l'utiliser et je ne trouve rien de comprehensible sur le net.

    J'ai crée un autre sujet qui traite uniquement du raccourci clavier :
    http://www.developpez.net/forums/sho...d.php?t=396574

  17. #17
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Tu n'as pas du bien chercher

    Regarde :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
        * using System;
        * using System.Windows.Forms;
        * using System.Runtime.InteropServices;
        * using System.Collections;
        *
        * namespace CSUtils.Classes
        * {
        * /// <summary>
        * /// Description résumée de Hotkey.
        * /// </summary>
        * public class HotKey : NativeWindow
        * {
        * private const int WM_HOTKEY = 0x312;
        *
        * /// <summary>
        * /// HotKeyModifiers énumération
        * /// </summary>
        * [Flags]
        * public enum HotKeyModifiers : int {
        * Alt = 0x1,
        * Control = 0x2,
        * Shift = 0x4,
        * Win = 0x8
        * }
        *
        * private struct HotKeyData {
        * public Keys Key;
        * public HotKeyModifiers Modifiers;
        * public IntPtr AtomID;
        *
        * public static HotKeyData Empty = new HotKeyData();
        *
        * public HotKeyData(Keys key, HotKeyModifiers modifiers, IntPtr atomId) {
        * this.Key = key;
        * this.Modifiers = modifiers;
        * this.AtomID = atomId;
        * }
        *
        * public override string ToString() {
        * return Modifiers.ToString() + "+" + Key.ToString();
        * }
        *
        * public override int GetHashCode() {
        * return base.GetHashCode ();
        * }
        *
        * public override bool Equals(object obj) {
        * return this.AtomID.Equals (obj);
        * }
        *
        * }
        *
        *
        * private ArrayList hotkeys;
        * private Form owner;
        *
        * public delegate void HotKeyHandler(object sender, HotKeyArgs args);
        * public event HotKeyHandler HotKeyPress;
        *
        * public HotKey(Form owner) {
        * this.AssignHandle(owner.Handle);
        * this.owner = owner;
        * owner.HandleCreated += new EventHandler(owner_HandleCreated);
        *
        * hotkeys = new ArrayList();
        * }
        *
        * public void RegisterHotKey(Keys key, HotKeyModifiers modifiers) {
        * if (!FindHotKey(key, modifiers).Equals(HotKeyData.Empty)) {
        * this.registerHotKey(key, modifiers);
        * }
        * }
        *
        * public void UnregisterHotKey(Keys key, HotKeyModifiers modifiers) {
        * HotKeyData hkData = FindHotKey(key, modifiers);
        *
        * if (!hkData.Equals(HotKeyData.Empty)) {
        * unregisterHotKey(hkData);
        * hotkeys.Remove(hkData);
        * }
        * }
        *
        * private HotKeyData FindHotKey(Keys key, HotKeyModifiers modifiers) {
        * HotKeyData hkData;
        * for (int i=0; i<this.hotkeys.Count; i++) {
        * hkData = (HotKeyData)hotkeys[i];
        * if (hkData.Key == key && hkData.Modifiers == modifiers) {
        * return hkData;
        * }
        * }
        *
        * return HotKeyData.Empty;
        * }
        *
        * protected override void WndProc(ref Message m) {
        * base.WndProc (ref m);
        * HotKeyData hkData;
        * if (m.Msg == WM_HOTKEY) {
        * for (int i=0; i<hotkeys.Count; i++) {
        * hkData = (HotKeyData)hotkeys[i];
        * if (hkData.Equals(m.WParam)) {
        * if (this.HotKeyPress != null) {
        * HotKeyPress(this.owner,
        * new HotKeyArgs(hkData.Key, hkData.Modifiers));
        * }
        * break;
        * }
        * }
        * }
        * }
        *
        *
        * /// <summary>
        * /// Destructeur de la classe.
        * /// Il faut libérer les raccourcis créés
        * /// </summary>
        * ~HotKey() {
        * HotKeyData hkData;
        * for (int i=hotkeys.Count-1; i>=0; i--) {
        * hkData = (HotKeyData)hotkeys[i];
        * this.unregisterHotKey(hkData);
        * }
        * }
        *
        * #region P/Invoke
        * [DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Auto)]
        * private static extern IntPtr GlobalAddAtom(string lpString);
        *
        * [DllImport("kernel32.dll", SetLastError=true, ExactSpelling=true)]
        * private static extern IntPtr GlobalDeleteAtom(IntPtr nAtom);
        *
        * [DllImport("user32.dll")]
        * private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);
        *
        * [DllImport("user32.dll")]
        * private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
        * #endregion
        *
        * private void registerHotKey(Keys key, HotKeyModifiers modifiers) {
        * string atomName = string.Empty;
        * IntPtr atomId;
        * atomName = key.ToString() + modifiers.ToString() + Environment.TickCount.ToString();
        * if (atomName.Length > 255) {
        * atomName = atomName.Substring(0,255);
        * }
        *
        * atomId = GlobalAddAtom(atomName);
        * if (atomId == IntPtr.Zero) {
        * throw new Exception("Impossible d'enregistrer l'atome du raccourci !");
        * }
        *
        * if (!RegisterHotKey(this.Handle, atomId.ToInt32(), (int)modifiers, (int)key)) {
        * GlobalDeleteAtom(atomId);
        * throw new Exception("Impossible d'enregistrer le raccourci !");
        * }
        *
        * this.hotkeys.Add(new HotKeyData(key, modifiers, atomId));
        * }
        *
        * private void unregisterHotKey(HotKeyData hk) {
        * UnregisterHotKey(this.Handle, hk.AtomID.ToInt32());
        * GlobalDeleteAtom(hk.AtomID);
        * }
        *
        *
        * private void owner_HandleCreated(object sender, EventArgs e) {
        * this.AssignHandle(owner.Handle);
        * }
        * }
        *
        * #region Classe HotKeyArgs
        * public class HotKeyArgs : EventArgs {
        * public HotKeyArgs(Keys key, HotKey.HotKeyModifiers modifiers) {
        * this.modifiers = modifiers;
        * this.key = key;
        * }
        *
        * private Keys key;
        * public Keys Key {
        * get {return key;}
        * }
        *
        * private HotKey.HotKeyModifiers modifiers;
        * public HotKey.HotKeyModifiers Modifiers {
        * get {return modifiers;}
        * }
        * }
        * #endregion
        * }
    En plus c'est une source qui as eu 10/10...

    Reste plus qu'a convertir le code avec les convertisseur actuel sur le net
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  18. #18
    Membre très actif Avatar de arnofly
    Homme Profil pro
    Développeur Web / Webdesigner
    Inscrit en
    Mai 2007
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web / Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 413
    Par défaut
    Je sens que tu va me donner un lien qui va me plaire

    Effectivement, j'avais trouvé ce code, merci qd m. En fait, j'en avais trouvé 3 mais pas exploitable à mon niveau.

    Je ne savais pas qu'il y avait un moyen de convertir les codes ! Enfin si, du VB6 au VB.NET mais pour les autres...

  19. #19
    Membre très actif Avatar de arnofly
    Homme Profil pro
    Développeur Web / Webdesigner
    Inscrit en
    Mai 2007
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web / Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 413
    Par défaut
    J'ai trouvé un lien qui semble convertir correctement du C# vers VB.NET
    http://www.carlosag.net/Tools/CodeTr...r/Default.aspx

    Bon, je vais étudier tout ça...

  20. #20
    Membre très actif Avatar de arnofly
    Homme Profil pro
    Développeur Web / Webdesigner
    Inscrit en
    Mai 2007
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web / Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 413
    Par défaut
    Apres conversion, voila ce que ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    Namespace CSUtils.Classes
        Imports System
        Imports System.Windows.Forms
        Imports System.Runtime.InteropServices
        Imports System.Collections
     
     
        ''' <summary>
        ''' Description r�sum�e de Hotkey.
        ''' </summary>
        Public Class HotKey
            Inherits NativeWindow
     
            Private Const WM_HOTKEY As Integer = 786
     
            Private hotkeys As ArrayList
     
            Private owner As Form
     
            Public Sub New(ByVal owner As Form)
                MyBase.New
                Me.AssignHandle(owner.Handle)
                Me.owner = owner
                AddHandler owner.HandleCreated, AddressOf Me.owner_HandleCreated
                hotkeys = New ArrayList
            End Sub
     
            ''' <summary>
            ''' Destructeur de la classe.
            ''' Il faut lib�rer les raccourcis cr��s
            ''' </summary>
            Private Sub New()
                MyBase.New
                Dim hkData As HotKeyData
                Dim i As Integer = (hotkeys.Count - 1)
                Do While (i >= 0)
                    hkData = CType(hotkeys(i),HotKeyData)
                    Me.unregisterHotKey(hkData)
                    i = (i - 1)
                Loop
            End Sub
     
            Public Event HotKeyPress As HotKeyHandler
     
            Public Overloads Sub RegisterHotKey(ByVal key As Keys, ByVal modifiers As HotKeyModifiers)
                If Not FindHotKey(key, modifiers).Equals(HotKeyData.Empty) Then
                    Me.registerHotKey(key, modifiers)
                End If
            End Sub
     
            Public Overloads Sub UnregisterHotKey(ByVal key As Keys, ByVal modifiers As HotKeyModifiers)
                Dim hkData As HotKeyData = FindHotKey(key, modifiers)
                If Not hkData.Equals(HotKeyData.Empty) Then
                    unregisterHotKey(hkData)
                    hotkeys.Remove(hkData)
                End If
            End Sub
     
            Private Function FindHotKey(ByVal key As Keys, ByVal modifiers As HotKeyModifiers) As HotKeyData
                Dim hkData As HotKeyData
                Dim i As Integer = 0
                Do While (i < Me.hotkeys.Count)
                    hkData = CType(hotkeys(i),HotKeyData)
                    If ((hkData.Key = key)  _
                                AndAlso (hkData.Modifiers = modifiers)) Then
                        Return hkData
                    End If
                    i = (i + 1)
                Loop
                Return HotKeyData.Empty
            End Function
     
            Protected Overrides Sub WndProc(ByRef m As Message)
                MyBase.WndProc(m)
                Dim hkData As HotKeyData
                If (m.Msg = WM_HOTKEY) Then
                    Dim i As Integer = 0
                    Do While (i < hotkeys.Count)
                        hkData = CType(hotkeys(i),HotKeyData)
                        If hkData.Equals(m.WParam) Then
                            If (Not (Me.HotKeyPress) Is Nothing) Then
                                HotKeyPress(Me.owner, New HotKeyArgs(hkData.Key, hkData.Modifiers))
                            End If
                            'TODO: Warning!!! break;If
                        End If
                        i = (i + 1)
                    Loop
                End If
            End Sub
     
            Private Declare Function GlobalAddAtom Lib "kernel32.dll" (ByVal lpString As String) As IntPtr
     
            Private Declare Function GlobalDeleteAtom Lib "kernel32.dll" (ByVal nAtom As IntPtr) As IntPtr
     
            Private Overloads Declare Function RegisterHotKey Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk As Integer) As Boolean
     
            Private Overloads Declare Function UnregisterHotKey Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal id As Integer) As Boolean
     
            Private Sub registerHotKey(ByVal key As Keys, ByVal modifiers As HotKeyModifiers)
                Dim atomName As String = string.Empty
                Dim atomId As IntPtr
                atomName = (key.ToString  _
                            + (modifiers.ToString + Environment.TickCount.ToString))
                If (atomName.Length > 255) Then
                    atomName = atomName.Substring(0, 255)
                End If
                atomId = GlobalAddAtom(atomName)
                If (atomId = IntPtr.Zero) Then
                    Throw New Exception("Impossible d'enregistrer l'atome du raccourci !")
                End If
                If Not RegisterHotKey(Me.Handle, atomId.ToInt32, CType(modifiers,Integer), CType(key,Integer)) Then
                    GlobalDeleteAtom(atomId)
                    Throw New Exception("Impossible d'enregistrer le raccourci !")
                End If
                Me.hotkeys.Add(New HotKeyData(key, modifiers, atomId))
            End Sub
     
            Private Sub unregisterHotKey(ByVal hk As HotKeyData)
                UnregisterHotKey(Me.Handle, hk.AtomID.ToInt32)
                GlobalDeleteAtom(hk.AtomID)
            End Sub
     
            Private Sub owner_HandleCreated(ByVal sender As Object, ByVal e As EventArgs)
                Me.AssignHandle(owner.Handle)
            End Sub
     
            ''' <summary>
            ''' HotKeyModifiers �num�ration
            ''' </summary>
            <Flags()>  _
            Public Enum HotKeyModifiers As Integer
     
                Alt = 1
     
                Control = 2
     
                Shift = 4
     
                Win = 8
            End Enum
     
            Private Structure HotKeyData
     
                Public Key As Keys
     
                Public Modifiers As HotKeyModifiers
     
                Public AtomID As IntPtr
     
                Public Shared Empty As HotKeyData = New HotKeyData
     
                Public Sub New(ByVal key As Keys, ByVal modifiers As HotKeyModifiers, ByVal atomId As IntPtr)
                    MyBase.New
                    Me.Key = key
                    Me.Modifiers = modifiers
                    Me.AtomID = atomId
                End Sub
     
                Public Overrides Function ToString() As String
                    Return (Modifiers.ToString + ("+" + Key.ToString))
                End Function
     
                Public Overrides Function GetHashCode() As Integer
                    Return MyBase.GetHashCode
                End Function
     
                Public Overrides Function Equals(ByVal obj As Object) As Boolean
                    Return Me.AtomID.Equals(obj)
                End Function
            End Structure
     
            Public Delegate Sub HotKeyHandler(ByVal sender As Object, ByVal args As HotKeyArgs)
        End Class
     
        Public Class HotKeyArgs
            Inherits EventArgs
     
            Private key As Keys
     
            Private modifiers As HotKey.HotKeyModifiers
     
            Public Sub New(ByVal key As Keys, ByVal modifiers As HotKey.HotKeyModifiers)
                MyBase.New
                Me.modifiers = modifiers
                Me.key = key
            End Sub
     
            Public ReadOnly Property Key As Keys
                Get
                    Return key
                End Get
            End Property
     
            Public ReadOnly Property Modifiers As HotKey.HotKeyModifiers
                Get
                    Return modifiers
                End Get
            End Property
        End Class
    End Namespace
    Pfff, j'y comprends rien de rien

Discussions similaires

  1. Comment augmenter la mémoire vive allouée à Python?
    Par syrius31 dans le forum Général Python
    Réponses: 19
    Dernier message: 28/03/2011, 17h20
  2. Comment reduire la consommation de la mémoire vive
    Par souarit dans le forum Débuter
    Réponses: 3
    Dernier message: 27/12/2008, 21h37
  3. Utilisation de la mémoire vive....
    Par Neilos dans le forum Windows
    Réponses: 9
    Dernier message: 24/11/2003, 12h09
  4. Objet et liberation de mémoire ...
    Par Mouss26 dans le forum Langage
    Réponses: 4
    Dernier message: 17/03/2003, 13h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo