Fenêtre en premier plan sans focus [Résolu]

thenaoh 111 Messages postés dimanche 28 septembre 2003Date d'inscription 24 juin 2015 Dernière intervention - 10 juin 2010 à 11:13 - Dernière réponse : racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention
- 15 juin 2010 à 22:23
Bonjour,

Je cherche depuis plusieurs jours à afficher une application de mon cru (une appli AIR) en premier plan, mais sans qu'elle prenne le focus aux autres fenêtres windows. J'ai déjà essayé le code suivant :

HWND hFenetre = FindWindow("ApolloRuntimeContentWindow", NULL);
ShowWindow(hFenetre, SW_SHOWNOACTIVATE);
SetWindowPos(hFenetre, HWND_TOPMOST, 10, 10, 500, 500, SWP_NOACTIVATE);

Il me met bien ma fenêtre en premier plan sans lui attribuer le focus à l'exécution de ce code. Mais ce que je souhaiterais, c'est que même quand je clique sur la fenêtre de mon application, qu'ell ne prenne jamais le focus.

Le but de cette manip est de pouvoir réaliser un clavier virtuel et, ayant déjà le code pour envoyer les caractères tapés dans le buffer clavier, il serait donc intéressant que la fenêtre cible (Bloc-notes Windows, barre d'adresse IE, etc ...) garde le focus pendant que je tape sur mon clavier virtuel.

Merci par avance pour votre aide !
Afficher la suite 

24 réponses

Répondre au sujet
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 10 juin 2010 à 20:05
+3
Utile
Salut,
Depuis Windows 2000, c'est possible en mettant le style étendu WS_EX_NOACTIVATE.
Pour créer la fenêtre principale de ton application tu peux faire:
hFenetre=CreateWindowEx(WS_EX_NOACTIVATE | WS_EX_TOPMOST,...

Ne pas oublier de mettre
#define _WIN32_WINNT 0x0500

juste avant
#include <windows.h>

Si tu veuwx changer le style édendu même quand la fenêtre est déjà créée, utilise SetwindowLong() ou SetWindowLongPtr().
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de racpp
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 10 juin 2010 à 20:47
+3
Utile
Essaie avec ça:
HWND hFenetre = FindWindow("ApolloRuntimeContentWindow", NULL); 
UINT styleex=GetWindowLong(hFenetre,GWL_EXSTYLE);	
SetWindowLong(hFenetre,GWL_EXSTYLE,styleex | WS_EX_NOACTIVATE);
SetWindowPos(hFenetre,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE);
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de racpp
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 11 juin 2010 à 02:01
+3
Utile
Voilà, c'est fait. Jette un coup d'oeil sur le code source que je viens de déposer:
FENETRE-FLOTTANTE-SANS-FOCUS
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de racpp
BunoCS 13764 Messages postés lundi 11 juillet 2005Date d'inscription 20 avril 2018 Dernière intervention - 10 juin 2010 à 11:35
0
Utile
Hello,
même quand je clique sur la fenêtre de mon application, qu'ell ne prenne jamais le focus

Je ne pense pas que ce soit possible. En effet, si tu cliques sur une fenêtre, c'est que tu veux interagir avec elle, donc que tu veux qu'elle prenne le focus.

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Commenter la réponse de BunoCS
thenaoh 111 Messages postés dimanche 28 septembre 2003Date d'inscription 24 juin 2015 Dernière intervention - 10 juin 2010 à 12:30
0
Utile
Bonjour,

Eh bien c'est bien ce que je me disais, mais en voyant ça : http://wpfkb.codeplex.com/ , où il y a un clavier virtuel en premier plan qui ne prenne pas le focus aux autres fenêtre, du coup, je me demande comment c'est possible ...

Si quelqu'un a une idée ...
Commenter la réponse de thenaoh
thenaoh 111 Messages postés dimanche 28 septembre 2003Date d'inscription 24 juin 2015 Dernière intervention - 10 juin 2010 à 13:26
0
Utile
Un bien meilleur exemple de ce que je veux faire à l'adresse suivante :

Touch-It Virtual Keyboard 4.3.0.3

Quelqu'un a une idée de comment c'est possible ?
Commenter la réponse de thenaoh
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 10 juin 2010 à 20:11
0
Utile
Le #define _WIN32_WINNT 0x0500 n'est utile que si le compilateur n'arrive pas à reconnaitre WS_EX_NOACTIVATE. C'est le cas dans mon Visual C/C++ 2005.
Commenter la réponse de racpp
thenaoh 111 Messages postés dimanche 28 septembre 2003Date d'inscription 24 juin 2015 Dernière intervention - 10 juin 2010 à 20:21
0
Utile
Salut,
Merci beaucoup racpp !

J'aurais cependant quelques petites questions (de débutant ) :
- peux-tu me donner un exemple complet pour l'utlisation de CreateWindowEx() ? J'avais déjà essayé mais sans succès pour le moment.
- peut-on faire cette manip (fenêtre qui ne prend jamais le focus) avec une fenêtre déjà créée ? En l'occurrence dans mon cas une application développée en AIR.

Merci !!!
Commenter la réponse de thenaoh
thenaoh 111 Messages postés dimanche 28 septembre 2003Date d'inscription 24 juin 2015 Dernière intervention - 10 juin 2010 à 20:58
0
Utile
Erratum : c'est bon, j'ai trouvé la réponse à ma première question tout seul comme un grand .

Par contre, la seconde question m'intéresse toujours, à savoir : peut-on faire cette manip (fenêtre qui ne prend jamais le focus) avec une fenêtre déjà créée ? En l'occurrence dans mon cas une application développée en AIR.

Merci !
Commenter la réponse de thenaoh
thenaoh 111 Messages postés dimanche 28 septembre 2003Date d'inscription 24 juin 2015 Dernière intervention - 10 juin 2010 à 20:59
0
Utile
Oups désolé, j'avais pas vu le post précédent !
Commenter la réponse de thenaoh
thenaoh 111 Messages postés dimanche 28 septembre 2003Date d'inscription 24 juin 2015 Dernière intervention - 10 juin 2010 à 21:04
0
Utile
YESSSSSSSSSSSSSSSSSSSS !!!!

Merci 1000 fois, j'vais pouvoir continuer avec ça !
Cela dit, je constate juste que le déplacement de ma fenêtre est fortement ralenti, à voir d'où ça peut venir...
Commenter la réponse de thenaoh
thenaoh 111 Messages postés dimanche 28 septembre 2003Date d'inscription 24 juin 2015 Dernière intervention - 10 juin 2010 à 21:13
0
Utile
Erratum (encore) !

En fait, ce n'est pas le déplacement de ma fenêtre qui est ralenti, c'est juste que je ne vois pas la fenêtre se déplacer tant que j'ai le bouton gauche de ma souris enfoncé ! En fait, j'appuie sur le bouton gauche de ma souris pour déplacer ma fenêtre, je la déplace, je relache le bouton de ma souris, et là, la fenêtre se déplace directement à l'endroit où je relache le bouton.

Une idée ??
Commenter la réponse de thenaoh
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 10 juin 2010 à 21:48
0
Utile
Il s'agit probablement d'un bug de Windows. On le contourne en ajoutant ce bout de code dans la procédure de la fenêtre pour forcer son déplacement ou redimentionnement:
case WM_MOVING:
case WM_SIZING:
{
    RECT *pRect=(RECT*)lParam;
    SetWindowPos(hFenetre, 0, pRect->left, pRect->top, pRect->right-pRect->left, pRect->bottom-pRect->top, 0);
    return TRUE;
}

Je ne connais pas AIR, mais je te coneille de travailler en Win32 API pour bien maitriser le comprtement de ta fenêtre.
Commenter la réponse de racpp
thenaoh 111 Messages postés dimanche 28 septembre 2003Date d'inscription 24 juin 2015 Dernière intervention - 10 juin 2010 à 23:00
0
Utile
Merci !

Bon par contre, je n'arrive pas à intégrer ton code, aussi je pense que je vais retourner à la case "le C++ pour les nuls" !
A moins que tu aies un code plus détaillé pour m'aiguiller, mais tu m'as déjà bien aidé pour aujourd'hui

Merci !
Commenter la réponse de thenaoh
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 10 juin 2010 à 23:46
0
Utile
D'accord, je vais essayer de trouver un petit moment pour faire une code source complet et le poster sur le site.
Commenter la réponse de racpp
thenaoh 111 Messages postés dimanche 28 septembre 2003Date d'inscription 24 juin 2015 Dernière intervention - 11 juin 2010 à 10:13
0
Utile
Whaouh !
Ah ben là, chapeau ! Méga-top !!
Merci beaucoup !!
Commenter la réponse de thenaoh
thenaoh 111 Messages postés dimanche 28 septembre 2003Date d'inscription 24 juin 2015 Dernière intervention - 11 juin 2010 à 13:01
0
Utile
J'aurais cependant une ultime question (promis après j'arrête ) :
Le code que tu as écrit pour forcer le déplacement d'une fenêtre peut-il être appliqué pour une fenêtre déjà existante, et si oui, comment ?
Commenter la réponse de thenaoh
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 12 juin 2010 à 12:29
0
Utile
Oui mais il faudra sous-classer la fenêtre cible. Puisqu'il s'agit d'un autre processus, tu auras besoin d'une technique appelée "L'injection de code par DLL". Un petit programme injecteur de quelques lignes de code, forcera le processus contenant la fenêtre cible à charger notre dll. Cette dll contiendra notre procédure de sous-classement qui remplacera la procédure originale de la fenêtre. Pour cela on utilise dans le DllMain de notre dll la fonction SetWindowLongPtr(). Cette dernière retourne l'adresse de la procédure originale qu'on devra utiliser dans notre procédure de sous-classement afin d'y aiguiller les messages qu'on ne veut pas traiter. Ainsi, les seuls messages qu'on doit intercepter sont WM_MOVING et WM_SIZING. Si tu veux un exemple complet, tu n'as qu'à attendre que j'aie encore un moment de libre pour créer le code source et le déposer sur le site. Je pense que ça intéressera d'autres membres.
Commenter la réponse de racpp
thenaoh 111 Messages postés dimanche 28 septembre 2003Date d'inscription 24 juin 2015 Dernière intervention - 12 juin 2010 à 12:52
0
Utile
Très volontiers !
Je vais me documenter davantage de mon côté en attendant
Encore merci !!
Commenter la réponse de thenaoh
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 15 juin 2010 à 02:00
0
Utile
Voici le code source comme promis:
SOUS-CLASSEMENT-FENETRE-AUTRE-PROCESS-INJECTION
Commenter la réponse de racpp

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Fenêtre en premier plan sans focus - page 2