VB6 : pouvoir activer une fenêtres en fonction de son Process Id (ou autrement ?

[Résolu]
Signaler
Messages postés
14
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
20 février 2007
-
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
-
Bonjour,

J'ai trouvé sur vbfrance comment récupérer le process Id d'une fenêtre notepad.exe (par exemple) ....

Comment faire pour activer ce process (le mettre en premier plan) en connaissant sont Pid ?

Ou peut être ya t il une autre solution sans le process ?

Merci d'avance de votre aide.

13 réponses

Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
47
salut,
Declare Function SetActiveWindow Lib "user32.dll" (ByVal hwnd As Long) As Long
PCPT [AFCK]
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 112 internautes nous ont dit merci ce mois-ci

Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
47
re,
hWnd est le Handle.
exemple, nouveau projet, 2 Form.
au click sur le bouton de la 1ère, on passe au premier plan la Form2 par son handle.
à remplacer par celui de ton notepad


Option Explicit
'
Private Declare Function SetActiveWindow Lib "user32.dll" _
(ByVal hwnd As Long) As Long
'
'
Private Sub Form_Load()
Form2.Show
End Sub
'
'
Private Sub Command1_Click()
Call SetActiveWindow(Form2.hwnd)
End Sub


<SMALL> Coloration syntaxique automatique [AFCK]</SMALL>


il y a cependant bien d'autres méthodes...
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 112 internautes nous ont dit merci ce mois-ci

Messages postés
14
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
20 février 2007

Ajout : Il ya je pense une histoire de Focus à gérer ...
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 112 internautes nous ont dit merci ce mois-ci

Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
47
j'peux pas faire beaucoup plus....
en tapant la ligne Shell, tu auras la proposition des paramètres, tel que vbMaximizedFocus par exemple.
si tu as besoin de plus d'infos, colle ici ton code et explique-toi plus clairement
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 112 internautes nous ont dit merci ce mois-ci

Messages postés
14
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
20 février 2007

Merci de ton aide. je dois partir, je repondrai ce soir
merci
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 112 internautes nous ont dit merci ce mois-ci

Messages postés
14
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
20 février 2007

Merci de repondre ...

>Declare Function SetActiveWindow Lib "user32.dll" (ByVal hwnd As Long) As >Long
>PCPT [AFCK]

Comment ca marche ?
hwnd ca représente koi ?

Peux tu me donner un exemple svp (je suis pa un pro) car je n'ai pas réussi à activer la fenêtre en question ...
Messages postés
14
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
20 février 2007

Cette méthode me convient ....
mais je n'arrive pas à la faire marcher ...

Call SetActiveWindow("notepad.exe")

me met un message d'erreur ...
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
47
re,
dans ce cas, relis ta question...
tu veux quoi, juste lancer une instance du bloc note?


Option Explicit
'
Private Sub Command1_Click()
Call Shell("notepad.exe", vbNormalFocus)
End Sub


<SMALL> Coloration syntaxique automatique [AFCK]</SMALL>


PCPT [AFCK]
Messages postés
14
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
20 février 2007

Non pas exactement ...

Dans mon cas, mon wordpad est déja ouvert (et en arriere plan) et je veux l'activer pour écrire des infos dedans ... et meme pouvoir activer tel ou tel process à volonté.

merci
Messages postés
14
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
20 février 2007

Le problème de la commande : Call Shell("notepad.exe", vbNormalFocus), dans mon cas

est que le notepad auquel je veux accéder est déja ouvert en arrière plan et je veux mettre le focus dessus afin
d'écrire du texte dedans , puis revenir sur mon vb.

si tu as en stock un bout de code qui fait cela, ça m'intéresse.

Je ne sais pas si je suis encore assez clair ...
Messages postés
14
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
20 février 2007

J'ai beau chercher sur le site, je ne trouve pas comment ouvris les exe (notepad.exe) puis (calc.exe), sans les fermer, puis se repositionner sur le notepad.exe ouvert précedement ...

Voici le code mis en place (je voudrais à la fin retomber sur le premier notepad ouvert (avec le texte envoyé par le sendkeys : à ce niveau la aussi, j'ai quelques problèmes ) :

'- - - - - - -- - - - - -- - --- - - - - -- -
' http://www.vbfrance.com/code.aspx?id=65


Public hProcess, nRet, Retour As Long
Const PROCESS_QUERY_INFORMATION = &H400

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long


Private Const PROCESS_TERMINATE = &H1
Private Const STILL_ACTIVE = &H103
Const fdwAccess = PROCESS_TERMINATE + PROCESS_QUERY_INFORMATION


Private Function WaitOnProgram(ByVal idProg As Long) As Long
Dim iExit As Long, hProg As Long
hProg = OpenProcess(PROCESS_ALL_ACCESS, False, idProg)
GetExitCodeProcess hProg, iExit
Do While iExit = STILL_ACTIVE
DoEvents
GetExitCodeProcess hProg, iExit
Loop
CloseHandle hProg
WaitOnProgram = iExit
End Function



Public Sub ShellWait(ByVal JobToDo As String)
Dim hProcess As Long, RetVal As Long

hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(JobToDo, vbMinimizedNoFocus))
Do
GetExitCodeProcess hProcess, RetVal
DoEvents
Sleep 100
Loop While RetVal = STILL_ACTIVE
End Sub


Private Sub Command1_Click()
Dim st As String

' Pour lancer le programme :
Retour = Shell("notepad.exe", 1)
SendKeys "a ecrire dans le notepad"
ret2 = Shell("calc.exe", 1)
' WaitOnProgram Retour
st = Text1.Text

' Form1.Text1.SetFocus



' Pour Fermer le programme :
hProcess = OpenProcess(fdwAccess, False, Retour)
'GetExitCodeProcess hProcess, nRet
'Call TerminateProcess(hProcess, nRet)
'Call CloseHandle(hProcess)


'''''
'On Error GoTo RunError:
'hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(sApplicationPathExe, vbNormalFocus))
'Do
'''Obtient le statut du process
'GetExitCodeProcess hProcess, RetVal


''petite pause pour laisser windows gérer les autres évenements
'DoEvents: Sleep 50


'''Loop jusqu'à ce que le process statut ne soit plus actif
'Loop While RetVal = STILL_ACTIVE

End Sub

'- - - - - - -- - - - - -- - --- - - - - -- -
Messages postés
14
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
20 février 2007

Salut,

J'ai trouvé la fonction que je cherchais ...
C'est --> appactivate (name)

Par contre sais tu s'il est possible d'exécuter les lignes de manière synchrone ... (c'est à dire en attendant la fin d'une exécution avant d'en commencer une autre).

Mon problème est que je veux activer mon notepad, faire un sendKeys "test senkeys", puis revenir dans ma forme vb6. Actuellement, le sendkeys n'est pas écrit partout ...
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
47
tape WaitProcess, tu as en fait besoin d'attendre l'execution complète du sendkeys.....

sinon tu peux aussi (si tu ne trouves rien) faire une simple boucle DoEvents après ton send....

@+
PCPT [AFCK]