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

MFC Discussion :

Activer/mettre le focus sur une fenêtre si non activée


Sujet :

MFC

  1. #1
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Activer/mettre le focus sur une fenêtre si non activée
    Bonjour à tous, je suis nouveau sur le forum, et j'espere que cette question n'a pas été postée des milleirs de fois

    J'ai une application qui apelle une dll où une boite de dialogue doit apparaitre afin de saisir la valeur d'un code à barre (douchette ou clavier). Par rapport à l'architecture génrérale, je suis obligé que cette boite de dialogue soit dans cette dll...

    Seul inconvénient, je suis obligé d'utiliser une autre application (dont je n'ai pas les sources) en même temps qui elle, reprend la main de temps en temps...

    j'ai mis cette boite de dialogue au premier plan grace à la commande
    ::SetWindowPos(m_hWnd ,HWND_TOPMOST,294,251,415,240,SWP_SHOWWINDOW);

    et ce qui est bizarre sous XP, c'est que la fenetre de saisie et celle de l'autre application semblent activées en même temps (les barres de titres sont en bleus foncés toutes les 2 mias la barre des taches de windows montre bien que c'est l'autre application qui est activée), le curseur clignote bien sur l'application de saisie, mais lorsque l'on saisie quelque chose, c'est l'autre application qui recoit les caractères !!! :

    voici ce que j'ai tenté de faire :
    Mettre un timer pour la fenêtre de saisie (toutes les 2 sec) et ce que je souhaite faire :
    Si la fenêtre n'est pas activée, on l'active et on permet la saisie, sinon, on ne fait rien.

    sauf que :
    -je ne suis pas certain de passer dans le timer si la fenêtre est désactivée
    - J'ai essayé de réactiver avec SetActiveWindow(); SetCapture(); sans effets
    - J'ai essayé avec SetFocus après les commandes précédentes, ce qui n'arrange rien à la situation sauf que lorsaue la fenêtre est activée, la saisie devient un enfer
    - Amélioration si je place SetForegroundWindow(); avant (la barre les taches clignote, mais je ne peux tout de même pas faire de saisie).

    Quelqu'un aurait-il une idée afin que je puisse réactiver cette fenêtre ?

    par avance merci,

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    Normalement, un SetFocus() sur le handle du controle où se fait la saisie devrait suffir

  3. #3
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour, et tout d'abord, merci pour ta réponse (je me sens un peu moins seul...)

    J'ai tenté ce que tu m'as dis, mais sans succès car même si le curseur bouge sur la boite de dialogue, le clavier envoie toujours les autres informations à l'autre application....

    voici ce que j'ai fait pour le moment....

    void DlgParam::OnTimer(UINT nIDEvent)
    {

    CDialog::OnTimer(nIDEvent);
    SetActiveWindow(); // Windows se doute que l'on souhaite travailler sur cette boite (bouton de la barre des taches qui clignote)
    SetForegroundWindow();

    ::SetWindowPos(HWND_BROADCAST ,HWND_TOPMOST,294,251,415,240,SWP_SHOWWINDOW|SWP_ASYNCWINDOWPOS); // j'ai essayé avec plein de flags, pas mieux
    :ostMessage(HWND_BROADCAST,WM_SETFOCUS, 0, 0);// le fait de mettre HWND_BROADCAST permet de ne plus ecrire dans d'autres applications ... mais je viens de voir que si ma fenetre de saisie est active, lorsque le timer est activé, la fenêtre se grise
    CWnd *pWnd=GetDlgItem(IDC_CODEBARRE) ;
    if(pWnd) pWnd->SetFocus();
    m_CodeBarre.SetFocus(); // le focus sur le controle .. de +ieus manières, pas mieux...



    }


    Si tu as d'autres idées, n'hésite pas, je suis preneur

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    As-tu essayé avec BringWindowToTop ?

    Moi, je dirais que ca devrait suffir, mais peut-etre que ton autre application récupère le focus aussi si jamais elle le perd

  5. #5
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Pas mieux....

    Pour info, je réalise des tests (pour le moment simplement avec une autre appli genre wordpad) ou je simule la premiere prise de focus en cliquant simplement dessus.

  6. #6
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    bizarre,

    en trichant, on pourrait faire un enchainement de plusieurs combines
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	ShowWindow(hnotepad, SW_MINIMIZE);
    	ShowWindow(hnotepad, SW_SHOWNORMAL);
    	SetForegroundWindow(hnotepad);
    Mais bon ...

  7. #7
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci pour cette subtilité, ça marche impeccable ... même si effectivement ce n'est pas super propre...

    pour info, la solution mise en place est :

    - on regarde toutes les 200 ms si par hasard on a pas perdu le focus.
    si c'est le cas, on abbaisse et réaffiche la fenêtre
    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
     
    void DlgParam::OnTimer(UINT nIDEvent) 
    {
    	// TODO: Add your message handler code here and/or call default
     
    	CDialog::OnTimer(nIDEvent);
     
    	CWnd* test = GetActiveWindow( );
     
    	if(m_HWND == NULL)
    		m_HWND = test;
     
    	if(test != m_HWND)
    	{
    		ShowWindow( SW_MINIMIZE); 
    		ShowWindow( SW_SHOWNORMAL); 
    		SetForegroundWindow();
    	}
    }
    Merci encor pour ton aide précieuse,

    sébastien

  8. #8
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut [Résolu] Activation/focus sur fenêtre
    merci

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Points : 121
    Points
    121
    Par défaut
    J'ai le même problème que toi et j'ai réussit à le résoudre
    http://www.developpez.net/forums/sho...d.php?t=109481


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

Discussions similaires

  1. [C#]Mettre le Focus sur une form
    Par nephhh dans le forum Windows Forms
    Réponses: 7
    Dernier message: 14/08/2007, 23h13
  2. Mettre le focus sur une requete de selection
    Par malingue dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 23/02/2007, 16h14
  3. Réponses: 10
    Dernier message: 15/10/2006, 17h23
  4. Mettre le focus sur une application
    Par Raylemon dans le forum Langage
    Réponses: 17
    Dernier message: 10/05/2006, 17h52
  5. Réponses: 43
    Dernier message: 03/03/2006, 19h41

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