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

C++ Discussion :

Changer la position des MsgBox


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2020
    Messages : 8
    Par défaut Changer la position des MsgBox
    Bonjour à tous,
    J'ai écris un petit programme en C++ qui change la position d'une seule MsgBox en utilisant la fonction : SetWindowsHookEx().
    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
    #include <windows.h>
    #include <TlHelp32.h>
    #include <Shlwapi.h>
    #include <Psapi.h>
     
    LRESULT CALLBACK msgBoxHook(int nCode, WPARAM wParam, LPARAM lParam) {
     
    LRESULT CALLBACK msgBoxHook(int, WPARAM, LPARAM);
     
    	DWORD WINAPI messageBoxThread(LPVOID);
    if (nCode == HCBT_CREATEWND) {
    CREATESTRUCT *pcs = ((CBT_CREATEWND *)lParam)->lpcs;
    if ((pcs->style & WS_DLGFRAME) || (pcs->style & WS_POPUP)) {
    	HWND hwnd = (HWND)wParam;
    int x = rand() % (GetSystemMetrics(SM_CXSCREEN) - pcs->cx);
    int y = rand() % (GetSystemMetrics(SM_CYSCREEN) - pcs->cy);
    			pcs->x = x;
    			pcs->y = y;
     }
    }
    return CallNextHookEx(0, nCode, wParam, lParam);
    }
    int main() {
    HHOOK hook = SetWindowsHookEx(WH_CBT, msgBoxHook, 0, GetCurrentThreadId());
    MessageBoxW(NULL, L"Msgbox | Test", L"MessageBox", MB_SYSTEMMODAL | MB_OK | MB_ICONIFORMATION);
    UnhookWindowsHookEx(hook);
     
              }
    Ce j'aimerais faire ici, c'est que dès que j’exécute mon programme, il y est au moins 10 MessageBox qui s'affichent à des endroits aléatoires sur l'écran de mon ordinateur.
    Merci de vos réponses!

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Heu, dis moi, tu pourrais pas essayer de présenter ton code "un peu plus correctement" en respectant des règles d'indentations un peu plus scrupuleusement

    Je sais pas, moi... Quelque chose comme
    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
    #include <windows.h>
    #include <TlHelp32.h>
    #include <Shlwapi.h>
    #include <Psapi.h>
    int main() {
        LRESULT CALLBACK msgBoxHook(int nCode, WPARAM wParam, LPARAM lParam) {
            LRESULT CALLBACK msgBoxHook(int, WPARAM, LPARAM);
     
            DWORD WINAPI messageBoxThread(LPVOID);
            if (nCode == HCBT_CREATEWND) {
                CREATESTRUCT *pcs = ((CBT_CREATEWND *)lParam)->lpcs;
                if ((pcs->style & WS_DLGFRAME) || (pcs->style & WS_POPUP)) {
                    HWND hwnd = (HWND)wParam;
                    int x = rand() % (GetSystemMetrics(SM_CXSCREEN) - pcs->cx);
                    int y = rand() % (GetSystemMetrics(SM_CYSCREEN) - pcs->cy);
                    pcs->x = x;
                    pcs->y = y;
                }
            }
            return CallNextHookEx(0, nCode, wParam, lParam);
        }
        int main() {
            HHOOK hook = SetWindowsHookEx(WH_CBT, msgBoxHook, 0, GetCurrentThreadId());
            MessageBoxW(NULL, L"Msgbox | Test", L"MessageBox", MB_SYSTEMMODAL | MB_OK | MB_ICONIFORMATION);
            UnhookWindowsHookEx(hook);
     
        }
    Avoue qu'il est tout de suite beaucoup plus facile à lire et à suivre, non

    Mais, du coup, on se rend compte que le code tel que présenté ne pourrait absolument pas être correct, parce que:
    1. tu définis deux fois la fonction main, ce qui ferait criser l'éditeur de liens, si tu arrivais jusque là, sauf que
    2. tu définis ta fonction msgBoxHook à l'intérieur de la première fonction main que tu définis, ce qui est strictement interdit (on ne peut pas définir une fonction à l'intérieur d'une fonction) et
    3. il manque une accolade fermante, ce que l'on remarque par le fait que le code commence contre le bord gauche de la fenêtre: la dernière accolade à se fermer doit donc être ... alignée avec le texte des premières lignes

    Maintenant, ce n'est peut-être qu'un "copier / coller" malheureux de ta part lorsque tu as décidé de poser la question sur le forum.

    Comme je suis vraiment trop gentil, je veux bien corriger tout cela, ne serait-ce que pour permettre aux lecteurs suivants d'essayer de compiler ton 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
    #include <windows.h>
    #include <TlHelp32.h>
    #include <Shlwapi.h>
    #include <Psapi.h>
    LRESULT CALLBACK msgBoxHook(int nCode, WPARAM wParam, LPARAM lParam) {
        LRESULT CALLBACK msgBoxHook(int, WPARAM, LPARAM); // j'ai un sérieux doute sur cette ligne :P :P :P
        DWORD WINAPI messageBoxThread(LPVOID);            // et sur celle-ci aussi
                                                          /* Elles ressemblent beaucoup plus à la déclaration de fonctions
                                                           * qu'à leur appel
                                                           */
        if (nCode == HCBT_CREATEWND) {
            CREATESTRUCT *pcs = ((CBT_CREATEWND *)lParam)->lpcs;
            if ((pcs->style & WS_DLGFRAME) || (pcs->style & WS_POPUP)) {
                HWND hwnd = (HWND)wParam;
                /* Hummm ... rand est une fonction en pur C, et nécessite
                 * l'invocation de srand, qui n'apparait nulle part
                 */
                int x = rand() % (GetSystemMetrics(SM_CXSCREEN) - pcs->cx);
                int y = rand() % (GetSystemMetrics(SM_CYSCREEN) - pcs->cy);
                pcs->x = x;
                pcs->y = y;
            }
        }
        return CallNextHookEx(0, nCode, wParam, lParam);
    }
    int main() {
        HHOOK hook = SetWindowsHookEx(WH_CBT, msgBoxHook, 0, GetCurrentThreadId());
        MessageBoxW(NULL, L"Msgbox | Test", L"MessageBox", MB_SYSTEMMODAL | MB_OK | MB_ICONIFORMATION);
        UnhookWindowsHookEx(hook);
     
    }
    Tout cela m'amène à te poser la "question qui fâche": connais tu un minimum le C++, ou t'es tu contenté de copier / coller du code sans rien y comprendre, croyant arriver à "faire quelque chose de sympa"
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2020
    Messages : 8
    Par défaut
    Merci de ta réponse
    Je suis désolé de ne pas avoir présenté mon code convenablement, je le ferai la prochaine fois.
    Le code que j'ai partagé à été copié collé de la ligne 1 à 23. Le reste, c'est moi qui l'ai adapté (bourré d'erreurs visiblement).
    Je manipule le C++ depuis maintenant un mois et demi et les projets que j'essaye de réaliser demande parfois plus de connaissances dans le domaine, c'est pourquoi je copie colle quelques fonctions ou déclarations sur des sites.
    Je te remercie d'avoir corrigé mon code et j'aimerais savoir si tu as une idée selon laquelle je pourrais faire apparaître au moins 10 messagesBox à des positions aléatoires à mon écran.
    Merci d'avance

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    En fait, si tu veux apporter une touche d'IHM à ton projet, je te déconseille très clairement de suivre la route que tu es occupé à te tracer (et qui consiste à tout faire à la mode windows). Ne serait-ce que parce que c'est une m...de sans nom à utiliser, et, surtout, parce que cela va rendre le portage (comprends: le fait de proposer le même programme sous linux ou sous IOS, par exemple) totalement impossible.

    Si tu as besoin de présenter une Interface Homme Machine graphique (avec de zolies fenêtres et tout plein de bôô boutons), je te conseillerais très clairement de te tourner vers Qt, qui sera beaucoup plus facile à mettre en oeuvre
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 482
    Par défaut
    Enfin, pour du hooking, il aura du mal à le faire ailleurs que sous Windows.

    Mais, par nature, une MessageBox est modale donc interdisant l'utilisation d'autres fenêtres, au moins au niveau de l'application.

    Clairement, Win32 de base, c'est vraiment une purge, donc à éviter, même si on en a besoin à un moment.
    Les bibliothèques graphiques ont généralement de quoi permettre l'accès à la couche graphique sous-jacente.

    Mais bon, la question semble faite pour faire une joke et fait clairement des "contre-sens", donc dans l'attente d'éclaircissement, ...

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

Discussions similaires

  1. [Toutes versions] Changer la langue des boutons d'une MsgBox
    Par qchamb dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 03/06/2015, 14h42
  2. Réponses: 0
    Dernier message: 04/03/2014, 16h25
  3. Changer la position des accolades
    Par T4unt dans le forum NetBeans
    Réponses: 7
    Dernier message: 11/07/2012, 16h48
  4. Réponses: 8
    Dernier message: 11/06/2009, 20h46
  5. Changer dynamiquement la position des onglets
    Par ginnovy dans le forum C++Builder
    Réponses: 2
    Dernier message: 11/09/2002, 18h24

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