Nom d'une fenetre active

Résolu
cs_rocker Messages postés 23 Date d'inscription mardi 11 octobre 2005 Statut Membre Dernière intervention 21 décembre 2011 - 10 mars 2007 à 03:35
cs_rocker Messages postés 23 Date d'inscription mardi 11 octobre 2005 Statut Membre Dernière intervention 21 décembre 2011 - 11 mars 2007 à 05:34
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 mars 2007 à 11:30
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++
3
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
10 mars 2007 à 08:54
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.
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
10 mars 2007 à 09:18
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 !!!
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
10 mars 2007 à 09:38
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
10 mars 2007 à 10:26
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 #
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
10 mars 2007 à 11:21
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 !
0
cs_rocker Messages postés 23 Date d'inscription mardi 11 octobre 2005 Statut Membre Dernière intervention 21 décembre 2011
11 mars 2007 à 05:34
je vien de m'apercevoir que je declairait la variable CurrentWindow dans le formload :S

Alors, probleme resolut ! merci a tous :)
0
Rejoignez-nous