Page 1 sur 1

Donner le focus à une fenêtre

Publié : dim. 18/avr./2004 15:53
par Le Soldat Inconnu
Salut,

je cherche le moyeu pour donner le focus à une fenêtre appartenant à un autre process.

SetForegroundWindow_ et GetForegroundWindow_ c'est du MS. en clair ça ne marche que quand ça veut :(
même le code de Fred sur ce sujet ne marche pas dans mon cas(SetReallyForegroundWindow)

pour donner le focus, j'ai un moyen paaliatif qui marche pratiquement à 100 %
mais c'est GetForeGroundWindow_() qui plante donc je ne peux pas vérifier que j'ai bien donner le focus (ce qui est absolument nécessaire dans mon programme)

alors si quelqu'un à une solution miracle (à part formater le dur et installer linux :mrgreen: ) merci d'avance :wink:

Publié : dim. 18/avr./2004 16:05
par julien
alors si quelqu'un à une solution miracle (à part formater le dur et installer linux ) merci d'avance
L'herbe est toujours plus verte dans le près du voisin :wink:

Publié : dim. 18/avr./2004 16:18
par julien
Voici une de mes routine que j'utilise pour mettre en premier plan des fenêtre du system.

Le code marche et ne plante pas (sur une config normale :wink: )

Code : Tout sélectionner


Procedure premier_plan(nom_fenetre$)
SetForegroundWindow_(FindWindow_(0,nom_fenetre$))
EndProcedure


premier_plan("Nom_de_ta_fenetre")

Publié : dim. 18/avr./2004 16:24
par cederavic
je confirme, sa marche ;)

Publié : dim. 18/avr./2004 17:12
par Le Soldat Inconnu
ben, c'est ce qui ne marche pas chez moi que ce soit sous 98, 2000, ou XP
ça ne marche que quand ça veut :(

je pense que mon problème vient du fait que je cherche à mettre au premier un autre process que j'ai mis en fenêtre enfant de mon programme.

tiens, ça me donne une idée, je vais essayer.

Publié : dim. 18/avr./2004 17:30
par julien
il me semble qu'il y'a une autre fonction pour les chils ?! :?:

Le code c pour les fenêtres principales ! :D

Publié : lun. 19/avr./2004 10:02
par Fred
Microsoft a modifié le comportement de ces fonctions pour eviter qu'une appli qui se lance en arriere plan vole le focus alors qu'on est en train de bosser tranquillement. C'est pour cela que le SetReallyForegroundWindwo() est a utiliser avec parcimonie. C'est pour eviter les derives : une bonne appli ne devrait pas forcer le focus :).

Publié : lun. 19/avr./2004 10:20
par Lukky
Je suis d'accord avec toi Fred mais bon tu peux avoir besoin de cette fonction de façon légitime, le Soldat a surement une bonne raison dans ce cas et c'est tout de même vraiment chiant cette manie de modifier les API toutes les 5 minutes.

Comment tu gère la compatibilité entre les version avec ce genre de politique !

JL

Publié : lun. 19/avr./2004 12:27
par Le Soldat Inconnu
moi, 'jen ai besoin pour envoyer des infos clavier pour mon bi-exploreur (une fenêtre qui met en child 2 explorateurs l'un au dessus de l'autre)

il faut donc que je donne le focus à la fenêtre pour envoyer des infos clavier afin de modifier l'affichage de l'explorateur automatiquement ou à la demande de l'utilisateur. comme je n'arrive pas à passer par un sendmessage_(window, #KeyDown, ....), je passe par ce principe.

l'astuce que j'ai trouvé pour donner le focus, c'est la suivante :
je récupère le texte de la barre d'adresse et je le remet dedans, puis je fais un appui sur la touche enter par le biais d'un sendmessage (tiens la ça marche, super comme comportement, c'est très constant)
et avec ceci, je donne toujours le focus à la fenêtre mais je n'arrive pas à le valider par getforegroungwindow_(), chercher l'erreur.

enfin, j'ai finis par trouver une astuce dans l'organisation de mon code qui me permet de m'en passer, ouf :roll:

Publié : lun. 19/avr./2004 17:33
par cederavic
pour donner le focus "clavier" a une fenetre, il faut utiliser SetFocus, je sais pas si sa marche pour une fenetre qui n'et pa du meme process, a essayer

Publié : mer. 21/avr./2004 12:19
par Le Soldat Inconnu
Non, justement :(

Publié : jeu. 22/avr./2004 16:12
par brossden
Bonjour
Pourriez vous essayer cela et me donner le résultat SVP !

Code : Tout sélectionner

Procedure devant(hand)
  res = SetForegroundWindow_(hand)  
Delay(1000)
EndProcedure


RunProgram("Sol.exe")
RunProgram("freecell.exe")

Sol=FindWindow_(0,"Solitaire")
Delay(100)
fre=FindWindow_(0,"FreeCell")
res.b=0
Delay(100)
For n=1 To 10
  devant(Sol)
  devant(fre)
Next

Publié : ven. 23/avr./2004 15:44
par Le Soldat Inconnu
ben, en fait, je peux me servir de setforegroundwindow une fois mais une seule fois, je ne peux pas le rappeler après car il ne marchera pas :(

Publié : lun. 26/avr./2004 12:21
par brossden
Bonjour

Tu tournes avec quel OS ? 98 Me Xp ??

Publié : lun. 26/avr./2004 14:03
par Le Soldat Inconnu
problème constaté sous 2000 et XP :wink: