DONNER À UNE FORM LE PREMIER PLAN ET LE FOCUS, D'ÊTRE SÉLÉCTIONÉ ! ! !

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 19 août 2012 à 14:49
jullouyot_46 Messages postés 43 Date d'inscription jeudi 9 décembre 2004 Statut Membre Dernière intervention 11 octobre 2013 - 11 oct. 2013 à 15:47
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/54528-donner-a-une-form-le-premier-plan-et-le-focus-d-etre-selectione

jullouyot_46 Messages postés 43 Date d'inscription jeudi 9 décembre 2004 Statut Membre Dernière intervention 11 octobre 2013
11 oct. 2013 à 15:47
passer la form: la_form au 1er plan, on peut aussi faire:
la_form.topmost = true (par exemple dans l'évènement onload
quand l'action à faire est terminée, repasser à false pour que ça fonctionne le prochain coup
Gorzyneon Messages postés 141 Date d'inscription lundi 25 juin 2007 Statut Membre Dernière intervention 19 mai 2023
21 mars 2013 à 17:00
ça serait bien si tu précisais les références nécessaires dans le projet visual basic
rebixav Messages postés 130 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 28 janvier 2013
16 déc. 2012 à 12:32
Sur un de mes logiciels, j'ai du remplacer deux lignes pour que cela marche bien :

=>>>
If la_form.Left + la_form.Width > 0 And (la_form.Left + la_form.Width) \ Screen.TwipsPerPixelX < Lx% Then x% = (la_form.Left + la_form.Width) \ Screen.TwipsPerPixelX: GoTo suite_y

par
If la_form.Left + la_form.Width > 0 And (la_form.Left + la_form.Width) \ Screen.TwipsPerPixelX < Lx% Then x% = (la_form.Left + la_form.Width) \ Screen.TwipsPerPixelX - 1: GoTo suite_y

et

=>>>
If la_form.Top + la_form.Height > 0 And (la_form.Top + la_form.Height) \ Screen.TwipsPerPixelY < Lx% Then Y% = (la_form.Top + la_form.Height) \ Screen.TwipsPerPixelY

par
If la_form.Top + la_form.Height > 0 And (la_form.Top + la_form.Height) \ Screen.TwipsPerPixelY < Lx% Then Y% = (la_form.Top + la_form.Height) \ Screen.TwipsPerPixelY - 1
rebixav Messages postés 130 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 28 janvier 2013
26 oct. 2012 à 09:17
oui j'ai dejà essayer SetTop(cela suffit pas) comme on le voie dans ma procédure, je fait :

1> un .show
2> un setwindows(SetTop) pour avoir la fenêtre en premier plan !
3> un clic de souris si on veut que cela force le focus, surtout la prise de focus !

...

là cela fait fait deux mois que je l'utilise sur un utilitaire que j'utilise 100 fois par jours, donc cela marche très bien !
Évidement comme on le voit dans ma procédure c'est un clic de souris à la fin qui donne le vrai focus(j'ai essayer tout type d'api donnant le focus), donc sur une fenetre incliné d'une autre façons peut poser problème, d'ailleur j'ai du faire une nouvelle mise à jour à ma procédure pour un autre utilitaire que j'utilise maintenant :
Public Sub Premier_plan(la_form As Form, Optional ByVal active As Boolean True, Optional ByVal Clic_mouse_pour_avoir_le_focus As Boolean False)
'force l'affichage au dessus des autres fenetres, bien sûr
'Clic_mouse_pour_avoir_le_focus=true permet de forcer le FOCUS définitevement ! ! ! !
' ps : cette dernière options marche à 90% sur la plupart des fenetres !
'il est fortement recommandé pour l'option clic_mouse que le borderstyle de la fenetre soit sur 1 !

la_form.Show

If active = True Then
SetWindowPos la_form.hWnd, -1, 0, 0, 0, 0, &H2 Or &H1
Else
SetWindowPos la_form.hWnd, -2, 0, 0, 0, 0, &H2 Or &H1
End If

If Clic_mouse_pour_avoir_le_focus = True Then
Souris X_av%, Y_av% 'la procédure perméttant de récupérer la position x et y de la souris lx% Screen.Width \ Screen.TwipsPerPixelX: ly% Screen.Height \ Screen.TwipsPerPixelY
form_lx% = (la_form.Left + la_form.Width / 2) / Screen.TwipsPerPixelX
If form_lx% > 0 And form_lx% < lx% Then x% = form_lx%: GoTo suite_y
If la_form.Left > 0 And la_form.Left \ Screen.TwipsPerPixelX < lx% Then x% = la_form.Left \ Screen.TwipsPerPixelX: GoTo suite_y
If la_form.Left + la_form.Width > 0 And (la_form.Left + la_form.Width) \ Screen.TwipsPerPixelX < lx% Then x% = (la_form.Left + la_form.Width) \ Screen.TwipsPerPixelX: GoTo suite_y
suite_y:
form_ly% = (la_form.Top + la_form.Height / 2) / Screen.TwipsPerPixelY
If form_ly% > 0 And form_ly% < lx% Then y% = form_ly%: GoTo suite
If la_form.Top > 0 And la_form.Top \ Screen.TwipsPerPixelY < ly% Then y% = la_form.Top \ Screen.TwipsPerPixelY: GoTo suite
If la_form.Top + la_form.Height > 0 And (la_form.Top + la_form.Height) \ Screen.TwipsPerPixelY < lx% Then y% = (la_form.Top + la_form.Height) \ Screen.TwipsPerPixelY

suite:
SetCursorPos x%, y%
'la_form.BorderStyle = 1 'zut cela ne fonctionne pas, le borderstyyle est en lecture seul !
Call mouse_event(MOUSEEVENTF_LEFTDOWN, x%, y%, 0, 0) 'on enfonce le bouton
Call mouse_event(MOUSEEVENTF_LEFTUP, x%, y%, 0, 0) 'on relache le bouton
SetCursorPos X_av%, Y_av% 'remet la souris à sa place d'origine, ni vue, ni connue ! :)
End If

End Sub

cadeaux indispensable pour ma procédure :

Public Function Souris(x%, y%)
Dim position_souris As POINTAPI
GetCursorPos position_souris x% position_souris.x: y% position_souris.y
End Function

et si vous avez toujours pas il faut cela aussi :

'-------------------------- la souris --------------------------
Public Type POINTAPI
x As Long
y As Long
End Type
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Public Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Public Declare Sub mouse_event Lib "user32" (ByVal dwflags As Long, _
ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, _
ByVal dwExtraInfo As Long)
' ---Définition des constantes---
Public Const MOUSEEVENTF_ABSOLUTE = &H8000
Public Const MOUSEEVENTF_LEFTDOWN = &H2
Public Const MOUSEEVENTF_LEFTUP = &H4
Public Const MOUSEEVENTF_MIDDLEDO = &H20
Public Const MOUSEEVENTF_MIDDLEUP = &H40
Public Const MOUSEEVENTF_MOVE = &H1
Public Const MOUSEEVENTF_RIGHTDOWN = &H8
Public Const MOUSEEVENTF_RIGHTUP = &H10
' Constantes de SetWindowPos :
Private Const HWND_TOPMOST As Long = -1
Private Const HWND_NOTOPMOST As Long = -2
Private Const SWP_NOSIZE As Long = &H1
Private Const SWP_NOMOVE As Long = &H2
Private Const SWP_NOACTIVATE As Long = &H10
Public Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

'---------- la déclaration suivante permet de rendre visible ou pas le cursseur (true ou false)
Public Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As Long

croyez moi cela fonctionne très bien ! ;)
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
1 sept. 2012 à 16:15
Gros danger si l'emplacement calculé du curseur tombe sur un bouton ou une case à cocher ...
As-tu essayé de faire un SetTop ?
(exemple VB6)

' Constantes de SetWindowPos :
Private Const HWND_TOPMOST As Long = -1
Private Const HWND_NOTOPMOST As Long = -2
Private Const SWP_NOSIZE As Long = &H1
Private Const SWP_NOMOVE As Long = &H2
Private Const SWP_NOACTIVATE As Long = &H10
Private Declare Function SetWindowPos Lib "user32" ( _
ByVal hWnd As Long, _
ByVal hWndInsertAfter As Long, _
ByVal X As Long, _
ByVal Y As Long, _
ByVal cx As Long, _
ByVal cy As Long, _
ByVal uFlags As Long) As Long
Public Sub SetTop(maForm As VB.Form, _
ByVal Topmost As Boolean)
Dim hWndInsertAfter As Long
If Topmost Then
hWndInsertAfter = HWND_TOPMOST
Else
hWndInsertAfter = HWND_NOTOPMOST
End If
SetWindowPos maForm.hWnd, hWndInsertAfter, 0, 0, 0, 0, _
SWP_NOSIZE Or SWP_NOMOVE Or SWP_NOACTIVATE
End Sub

et, pour faire passer ta forme en premier plan permanent + suppression de la permanence :
Call (maForme, True)
DoEvents
' et derrière aussitôt
Call (maForme, False)
rebixav Messages postés 130 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 28 janvier 2013
1 sept. 2012 à 15:47
oui en faite comme je l'ais expliquez là
http://www.vbfrance.com/forum/sujet-COMMENT-FAIRE-GLISSER-FORM-VENANT-BORDDE-ECRAN_1605687.aspx

impossible d'avoir le vrai focus, avec .focus, avec plein d'api !
mon onglet dans la barre des tache clignotez mais rien à faire, impossible lorsque je tapais au clavier d'avoir des caractères qui s'affiche !

en faite le problème est simple a reproduite :
vous faite un 1er.exe avec VB6 et vous demandez dans 20 secondes de lancer la calculette, ou un autre 2ème.exe ayant une form ayant un textbox !

lorsque vous lancerez votre 1er.exe, vous lancer modzilla, ou internet explorer et vous surfer comme si de rien n'était :
et bien vous remarquerez que le lancement que vous avez demandez dans les 20 secondes(vous pouvez mettre un peu moins !)
celui-ci apparait dans la barre des taches, clignotte, mais il n'est pas là devant vous ! ! !
...
Donc j'ai fait cette procédure un peu primaire(mais cela marche)
pour :
1 - afficher en premier plan
2 - cliquer dessus pour avoir le focus réelle !

à la la qu'est ce qui faut pas faire, en tout cas cela fait 2 semaine que cela marche trés bien, c trop cool !
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
19 août 2012 à 14:54
Ah, ton problème initial était sous Word où il n'y a pas de zOrder.
Si l'objet est affiché (même derrière les autres), as-tu essayé ceci ?
UserForm2.TextBox1.SetFocus
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
19 août 2012 à 14:49
Et le zOrder de la forme ne suffisait pas à la mettre au premier plan ?
Rejoignez-nous