Donner le focus à une fenêtre

Programmation d'applications complexes
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Donner le focus à une fenêtre

Message par Le Soldat Inconnu »

Salut,

Gros problème : je n'arrive pas à donner le focus correctement à une fenêtre.

j'utilise pour le moment l'Api SetForeGroundWindow() mais ça marche que quand ça veut et ça m'énerve

Quelqu'un a-t-il une autre solution, merci

Mon but étant de donner le focus à une fenêtre afin de pouvoir envoyer des informations de la part du clavier vers la fenêtre.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Fred
Site Admin
Messages : 2648
Inscription : mer. 21/janv./2004 11:03

Message par Fred »

cherche sur le forum anglais une routine qui s'appelle ReallySetForeground() ou SetReallyForeground(), ca devrait faire l'affaire
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

J'ai du voir ça dans Code Archiv et il me semble que c'est pas mieux. je refais un test merci
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

j'ai ça, et visiblement, c'est de toi :

Code : Tout sélectionner

Procedure SetForegroundWindow(Window) 

  hWnd = WindowID(Window) 

  ; If the window is in a minimized state, maximize now 
  
  If GetWindowLong_(hWnd, #GWL_STYLE) & #WS_MINIMIZE 
    ShowWindow_(hWnd, #SW_MAXIMIZE) 
    UpdateWindow_(hWnd) 
  EndIf 
  
  ; Check To see If we are the foreground thread 
  
  foregroundThreadID = GetWindowThreadProcessId_(GetForegroundWindow_(), 0) 
  ourThreadID = GetCurrentThreadId_() 
  ; If not, attach our thread's 'input' to the foreground thread's 
  
  If (foregroundThreadID <> ourThreadID) 
    AttachThreadInput_(foregroundThreadID, ourThreadID, #TRUE); 
  EndIf 
  
  ; Bring our window To the foreground 
  SetForegroundWindow_(hWnd) 
  
  ; If we attached our thread, detach it now 
  If (foregroundThreadID <> ourThreadID) 
    AttachThreadInput_(foregroundThreadID, ourThreadID, #FALSE) 
  EndIf  
  
  ; Force our window To redraw 
  InvalidateRect_(hWnd, #NULL, #TRUE) 
EndProcedure 
et ça marche en plus :wink: ouf.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

enfin, ça marche, il faut ajouter un delay derrière ce code, sinon, la fenêtre n'a pas le temps de passer au premier plan et de prendre le focus et ça gatouille :wink:
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
brossden
Messages : 818
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Attention lorsque une API renvoie une valeur il faut imperativement l'attribuer à une variable sous PB sinon cela ne marche pas !

Exemple

SetForegroundWindow_(hand) ne fonctionne pas ou mal, mais
res = SetForegroundWindow_(hand) fonctionne parfaitement

Le code suivant pour donner le focus au jeux du solitaire préalablement lancer sur la machine puis l'avoir plein écran :

Code : Tout sélectionner

hand = FindWindow_(0,"Solitaire")
res=SetForegroundWindow_(hand) 
res=ShowWindow_(hand, #SW_MAXIMIZE)
Denis

Bonne Jounée à tous
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Ah bon, je savais pas ce truc.
la prochaine fois que j'ai un prob, j'y penserais, merci
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Je me suis aperçu de celà avec certaines API, pas toutes. J'ai déjà eu le tour en particulier avec SetWIndowLong (mais pas toujours). Je ne sais pas pourquoi, car en règle général, la valeur de retour de l'API se retrouve dans l'accumulateur eax.

Ah ces API...
Fred
Site Admin
Messages : 2648
Inscription : mer. 21/janv./2004 11:03

Message par Fred »

C'est une blague le coup de l'affectation de la valeur de retour ? Ca n'a absolument rien a voir... Vous avez des exemples concrets ?
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Non Fred, je t'assure que ce que j'ai écrit est vrai :!: , mais je n'ai pas d'exemples foireux sous la main .

Ca fait un moment que c'est arrivé et je n'ai pas eu de nouveau ce problème.

Moi non plus je n'explique pas pourquoi, mais je maintiens ce que je dis. Je n'ai aucune raison de raconter des salades.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Je viens de me rappeler comment je m'étais aperçu de ça.

J'utilisais l'API et ca marchait pas et donc j'ai fait un débug pour voir le résultat de l'API et là ça marchait.

J'enlève le debug et ça marche plus.
J'ai ensuite mis a = SetwindowLong_(...) et ça marchait.
ça marchait, raison pour laquelle lorsque j'utilise cette API je met toujours a =
C'est surement à tort mais comme je n'ai pas cherché la vrai raison, j'en suis resté là.
Fred
Site Admin
Messages : 2648
Inscription : mer. 21/janv./2004 11:03

Message par Fred »

Ca doit etre un autre bug quelquepart que tu as décalé en insérant une affectation (ca genere plus de code, du coup ca decale la suite du programme). Je confirme, ca n'a rien a voir et si vous tombez sur un cas suspect, n'hésitez pas a m'en faire part :wink:
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Je suis d'accord avec toi Fred,
j'ai écrit assez de code asm pour comprendre que l'affectation d'une valeur à eax ne génère pas d'erreur si on ne la retourne pas bien qu'elle soit retournée sans être affectée à une variable.

ca me rapelle le code de Régis qui utilisait une structure LV_Coulumn (de mémoire) sous XP et qui générait une erreur car on écrasait les données de la pile et en particulier l'adresse de retour.

En utilisant la déclaration LVCOLUMN de MS, plus de problèmes.

SI j'arrive à recréer le problème, je t'envoie le code.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

tient, au fait, pour le coup de l'attente, j'ai eu 2 problèmes à la suite.
il faut attendre que la fenêtre prenne le focus et après j'envoyais l'info clavier ctrl V puis ctrl C et bien il faut aussi attendre que le ctrl V soit effectué.

faut que je reteste juste avec le delai pour le ctrl V mais à mon avis, il faut les 2 car y'a des fois ou ça arrive à m'afficher que je m'ai plus d'une seconde pour donner le focus 8O
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
brossden
Messages : 818
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Bonjour à tous

Je ne sais pas pourquoi Fred se refuse à accepter l'évidence. Je ne sais pas pourquoi, n'ai aucune explication ) donner, mais c'est ainsi si on affecte pas une variable à certaines API, elles ne fonctionnent pas pour certaine et fontionnent d'une manière aléatoire pour d'autre.
Denis

Bonne Jounée à tous
Répondre