cs_rocker
Messages postés23Date d'inscriptionmardi 11 octobre 2005StatutMembreDernière intervention21 décembre 2011
-
10 mars 2007 à 03:35
cs_rocker
Messages postés23Date d'inscriptionmardi 11 octobre 2005StatutMembreDernière intervention21 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
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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.
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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.
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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 !!!
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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 #