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

WinDev Discussion :

API Windows désactiver option de menu [WD12]


Sujet :

WinDev

  1. #1
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut API Windows désactiver option de menu
    Bonjour,

    Je suis en train de sécher sur la désactivation d'une option de menu d'une appli que j'essaye de piloter. Le but est d'empêcher l'utilisateur de quitter cette appli.

    Etape 1 : Récupérer le handle de l'appli par son nom. OK
    Etape 2 : Désactiver la croix de fermeture (cela fonctionne grâce à un code de Jurassic Pork, merci à lui )
    Etape 3 : Essayer de désactiver un item du menu. Pas d'erreur d'éxécution mais code inopérant.
    Etape 4 : Rechercher le mot "Quitter" dans le menu. Là, plantage...

    Code Etape 3 : On récupère le menu, le sous-menu et l'item du menu. Ensuite désactivation... Code inopérant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    hWnd = SysFenHandle("Calculatrice")
    nMenu est entier sans signe
    nSousMenu est entier sans signe
    nIdItemSousMenu est entier sans signe
    lpString est une chaîne
    
    nMenu = API("USER32","GetMenu",hWnd)
    nSousMenu = API("USER32","GetSubMenu",nMenu,0) // 1° sous menu
    nIdItemSousMenu = API("USER32","GetMenuItemID",nSousMenu,1)// 2° item du sous menu
    
    RetourFonction=API("USER32","EnableMenuItem",nIdItemSousMenu,0xF060,0x0011)
    Code Etape 4: Suite du code précédent. lpSting doit récupérer la chaine de l'item spécifié, 10 est la taille de la chaine, et 0x0000 est censée être l'option qui va bien (là, je n'ai pas tout compris, je crois)...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RetourFonction=API("USER32","GetMenuStringA",nSousMenu,nIdItemSousMenu,&lpString,10,0x0000)
    Si quelqu'un a des pistes, merci d'avance...
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  2. #2
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    615
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 615
    Points : 841
    Points
    841
    Par défaut
    Bonjour
    Qu'appelles-tu code inopérant ?
    Quel plantage as-tu ?
    Tu ne récupères rien du tout dans ton code étape 3 ?

    Gancau

  3. #3
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    J'avais oublié de mettre la ligne qui est censée griser, l'item 2 du premier sous menu (en rouge dans mon message précédent).

    Les handles des menu/sous-menu/item sont bien valorisés.
    La ligne de l'appel à l'api EnableMenuItem s'exécute (retour = vrai) mais l'item correspondant n'est pas grisé.

    Pour l'étape 4, j'ai un beau message d'erreur : mécanisme de sécurité du wlangage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Erreur à la ligne 49 du traitement...
    Vous avez appelé la fonction API.
    Une erreur système inattendue est survenue.
    Si cet incident...
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  4. #4
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    J'ai trouvé la raison de plantage : La chaine doit être de taille fixe.
    Ca fonctionne !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LpString est une chaîne fixe sur 15
    RetourFonction=API("USER32","GetMenuStringA",nSousMenu,nIdItemSousMenu,lpString,10,0x0000)
    lpstring est une chaine qui vaut C&oller<TAB>Ctrl+V<0>.

    A partir de là, par une boucle, je vais pouvoir retrouver "Quitter" dans le menu.

    Il ne me reste plus que l'étape 3 à faire fonctionner. Je vais revérifier les types...
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  5. #5
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    L'étape 3 fonctionne... sans fonctionner...
    Je m'explique :
    Lorsque je lance une première fois ma procédure, il me renvoie 0, ce qui est l'état initial de mon item de menu.
    Lorsque je lance une deuxième fois ma procédure, il me renvoie 3, ce qui est l'état dans lequel est mon item puisque je viens de le modifier.
    Le seul truc, c'est que mon item est toujours actif et non grisé...
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  6. #6
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Je n'ai pas trouvé la solution que je souhaitais, alors j'en ai utilisé une autre : je supprime les items de menu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RetourFonction = API("USER32","RemoveMenu",HandleSousMenu,PositionItem,0x0400)
    Je passe en résolu...
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  7. #7
    Membre éprouvé Avatar de wimbish
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 416
    Points : 1 073
    Points
    1 073
    Par défaut
    Re Bonjour Claude,

    Je comprend ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RetourFonction = API("USER32","RemoveMenu",HandleSousMenu,PositionItem,0x0400)
    cela correspond a : MF_BYPOSITION 0x00000400L

    En revanche je ne comprend pas ces valeurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RetourFonction=API("USER32","EnableMenuItem",nIdItemSousMenu,0xF060,0x0011)
    ne devrait tu pas avoir :
    MF_BYPOSITION
    0x00000400L
    Indicates that uIDEnableItem gives the zero-based relative position of the menu item.
    MF_DISABLED
    0x00000002L
    Indicates that the menu item is disabled, but not grayed, so it cannot be selected.
    voir ici : http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx


    [EDIT]
    Grosse fatigue !!
    Laisses tomber, Wimbish dit que des conneries aujourd'hui.
    Christophe.

    Tous les chemins mènent à Rome http://doc.pcsoft.fr/fr-FR/

  8. #8
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Tu as raison : j'ai écrit une connerie (moi aussi j'en fait des belles ).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RetourFonction=API("USER32","EnableMenuItem",nIdItemSousMenu,0xF060,0x0003)
    Le 0xF060 correspond à la croix de la fenêtre, on n'est pas en position (MF_BYPOSITION = 0x400) mais en identification directe -> MF_BYCOMMAND (valeur 0x0000).

    Par contre, J'ai un MF_GRAYED (0x0001) ou binaire MF_DISABLED (0x0002).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MF_BYCOMMAND | MF_GRAYED | MF_DISABLED = 0x0003
    et pas 0x0011 (même si le comportement est le même car grisé)
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Désactiver option menu via API
    Par frenchsting dans le forum Windows
    Réponses: 2
    Dernier message: 23/10/2012, 11h18
  2. Comment désactiver l'option du menu de la page active
    Par pasc06 dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 31/12/2008, 10h10
  3. API windows : problème menu
    Par Gregbeacher dans le forum Windows
    Réponses: 4
    Dernier message: 13/06/2007, 15h35
  4. Menu API windows
    Par .GriGri dans le forum Windows
    Réponses: 6
    Dernier message: 07/08/2006, 16h30
  5. Réponses: 3
    Dernier message: 13/06/2005, 12h05

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