Nom d'une fenetre active

[Résolu]
Signaler
Messages postés
23
Date d'inscription
mardi 11 octobre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
-
Messages postés
23
Date d'inscription
mardi 11 octobre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
-
Salut, je me code un programme qui, a chaque fois que la fenetre active ("on top") change, sont nom est enregistrer dans un fichier.

Voici le code.

Private Sub Timer3_Timer()
If currentwindow <> GetCaption(GetForegroundWindow) Then
currentwindow = GetCaption(GetForegroundWindow)
open "fichier.txt" for output as #1
print #1, vbCrLf & vbCrLf & "<" & Time & "> [" & currentwindow & "]" & vbCrLf
End If
End Sub

Je precise que currentwindow = GetCaption(GetForegroundWindow) est aussi dans le formload.

Mon probleme, est que currentwindow est toujours different de GetCaption(GetForegroundWindow) ce qui est bizzare. Meme si example je laisse ouvert firefox en premiere page, il sera toujours enregistrer dans le txt. Voici la function du GetCaption si sa peux aider ...

Function GetCaption(WindowHandle As Long) As String
    Dim Buffer As String, TextLength As Long
    TextLength& = GetWindowTextLength(WindowHandle&)
    Buffer$ = String(TextLength&, 0&)
    Call GetWindowText(WindowHandle&, Buffer$, TextLength& + 1)
    GetCaption$ = Buffer$
End Function

Merci de vos reponses.

7 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Un timer est déjà couteux, autant ne faire le travail qu'1 seule fois:
Private Sub Timer1_Timer()
  Dim s As String
  s = GetCaption(GetForegroundWindow)
  If currentwindow <> s Then
    currentwindow = s
    Print currentwindow  'j'imprime sur la Form pour contrôler plus confortablement
  End If
End Sub


casy > La voix du bon sens.
Surveiller création de fenêtre:
- hook system WH_SHELL
- On vérifie si nCode = HSHELL_WINDOWCREATED.
- Si OK, la DLL écrit dans le fichier.

ciao...
BruNews, MVP VC++
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
Bonjour,

ce que je lis là devrait fonctionner sans problème et tu dis que tel n'est pas le cas !
J'en déduis une seule cause possible : tu n'a pas déclaré currentwindow comme variable globale (Private currentwindows en haut de ton code), ce qui fait que cette chaîne est vide à chaque tour de ton timer et donc différente de la nouvelle !

J'en profite (mais celà n'a rien à voir) pour appeler ton attention sur le fait que tu laisses ouvert le fichier ouvert par
open "fichier.txt" for output as #1
Pense tout de même à le fermer, hein ... (mais rien à voir avec ton problème principal).

Mets dont Private currentWindows as string en haut de ton code.
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
Re salut

Bon,

J'ai voulu en avoir le coeur net et ai donc recopié rigoureusement ton code (bien que je n'en aime pas totalementl'écriture), en le complétant par les déclarations des fonctions de l'Api dont tu te sers (en supposant, bien évidemment, que tu l'as également fait chez toi sans te tromper) et j'ai ajouté ce que je t'ai dit plus haut.

Je n'ai pas envoyé dans un fichier mais affiché directement sur ma Form par un print pour contrôler plus facilement.

Je confirme que tout marche bien en ajoutant ce que je t'ai dit plus haut !!!
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
Allez, je dois sortir...

Voilà donc, pour que tout soit clair :

Option Explicit
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" _
(ByVal hwnd As Long) As Long
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
(ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long




Private currentwindow As String



Private Sub Form_Activate()
  Me.AutoRedraw = True ' uniquement là pour ne pas "perdre" ce qui est imprimé quand je change de focus
  currentwindow = "" ' ou, bien sur, sa valeur réelle, comme tu veux
End Sub


Private Sub Timer1_Timer()
  If currentwindow <> GetCaption(GetForegroundWindow) Then
    currentwindow = GetCaption(GetForegroundWindow)
    Print currentwindow   'j'imprime sur la Form pour contrôler plus confortablement
  End If
End Sub


Function GetCaption(WindowHandle As Long) As String
    Dim Buffer As String, TextLength As Long
    TextLength& = GetWindowTextLength(WindowHandle&)
    Buffer$ = String(TextLength&, 0&)
    Call GetWindowText(WindowHandle&, Buffer$, TextLength& + 1)
    GetCaption$ = Buffer$
End Function
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
39
A noter pour FireFox, que le nom de la fenetre reprend le nom de la page ou site actuellement visité. Donc par conséquent à chaque nouvelle page web visitée, le nom de la fenetre Firefox change et ton code va systématiquement la considérée comme une nouvelle application.

Il en va ainsi pour de nombreuses autres applications, Word, Excel, OpenOffice, Acrobat Reader, etc......

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
Bonjour Casy,

C'est sûr !

Mais, tel qu'il s'y était pris,  son timer affichait à chaque intervalle le titre de sa propre fenêtre, même s'il n'en bougeait pas !
Messages postés
23
Date d'inscription
mardi 11 octobre 2005
Statut
Membre
Dernière intervention
21 décembre 2011

je vien de m'apercevoir que je declairait la variable CurrentWindow dans le formload :S

Alors, probleme resolut ! merci a tous :)