Fenêtre en premier plan sans focus

Résolu
thenaoh Messages postés 111 Date d'inscription dimanche 28 septembre 2003 Statut Membre Dernière intervention 24 juin 2015 - 10 juin 2010 à 11:13
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 - 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 !

24 réponses

racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
10 juin 2010 à 20:05
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().
3
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
10 juin 2010 à 20:47
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);
3
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
11 juin 2010 à 02:01
Voilà, c'est fait. Jette un coup d'oeil sur le code source que je viens de déposer:
FENETRE-FLOTTANTE-SANS-FOCUS
3
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
10 juin 2010 à 11:35
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...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
thenaoh Messages postés 111 Date d'inscription dimanche 28 septembre 2003 Statut Membre Dernière intervention 24 juin 2015
10 juin 2010 à 12:30
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 ...
0
thenaoh Messages postés 111 Date d'inscription dimanche 28 septembre 2003 Statut Membre Dernière intervention 24 juin 2015
10 juin 2010 à 13:26
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 ?
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
10 juin 2010 à 20:11
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.
0
thenaoh Messages postés 111 Date d'inscription dimanche 28 septembre 2003 Statut Membre Dernière intervention 24 juin 2015
10 juin 2010 à 20:21
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 !!!
0
thenaoh Messages postés 111 Date d'inscription dimanche 28 septembre 2003 Statut Membre Dernière intervention 24 juin 2015
10 juin 2010 à 20:58
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 !
0
thenaoh Messages postés 111 Date d'inscription dimanche 28 septembre 2003 Statut Membre Dernière intervention 24 juin 2015
10 juin 2010 à 20:59
Oups désolé, j'avais pas vu le post précédent !
0
thenaoh Messages postés 111 Date d'inscription dimanche 28 septembre 2003 Statut Membre Dernière intervention 24 juin 2015
10 juin 2010 à 21:04
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...
0
thenaoh Messages postés 111 Date d'inscription dimanche 28 septembre 2003 Statut Membre Dernière intervention 24 juin 2015
10 juin 2010 à 21:13
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 ??
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
10 juin 2010 à 21:48
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.
0
thenaoh Messages postés 111 Date d'inscription dimanche 28 septembre 2003 Statut Membre Dernière intervention 24 juin 2015
10 juin 2010 à 23:00
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 !
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
10 juin 2010 à 23:46
D'accord, je vais essayer de trouver un petit moment pour faire une code source complet et le poster sur le site.
0
thenaoh Messages postés 111 Date d'inscription dimanche 28 septembre 2003 Statut Membre Dernière intervention 24 juin 2015
11 juin 2010 à 10:13
Whaouh !
Ah ben là, chapeau ! Méga-top !!
Merci beaucoup !!
0
thenaoh Messages postés 111 Date d'inscription dimanche 28 septembre 2003 Statut Membre Dernière intervention 24 juin 2015
11 juin 2010 à 13:01
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 ?
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
12 juin 2010 à 12:29
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.
0
thenaoh Messages postés 111 Date d'inscription dimanche 28 septembre 2003 Statut Membre Dernière intervention 24 juin 2015
12 juin 2010 à 12:52
Très volontiers !
Je vais me documenter davantage de mon côté en attendant
Encore merci !!
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
15 juin 2010 à 02:00
Voici le code source comme promis:
SOUS-CLASSEMENT-FENETRE-AUTRE-PROCESS-INJECTION
0
Rejoignez-nous