Handle word probléme avec FindWindow [Résolu]

Signaler
Messages postés
67
Date d'inscription
mardi 5 décembre 2000
Statut
Membre
Dernière intervention
5 juillet 2010
-
Messages postés
67
Date d'inscription
mardi 5 décembre 2000
Statut
Membre
Dernière intervention
5 juillet 2010
-
Bonjour je suis débutant en vb.net et je n'arrive pas à avoir le handle de Word pour effectuer un hook.

Je fais Word_hwnd = FindWindow(vbNullString, "Microsoft Word")

Ce n'est pas le bonne syntaxe ?

merci d'avance :)
A voir également:

42 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
http://msdn2.microsoft.com/en-us/library/ms683181(VS.85).aspx

on y voit:
DWORD WINAPI GetCurrentProcessorNumber(void);

donc:
Function GetCurrentProcessorNumber() As Long

ensuite:
Library Use Kernel32.lib.

donc:
Declare Function GetCurrentProcessorNumber Lib "Kernel32" () As Long


gaffe, par contre:
Requirements
Client Requires Windows Vista.
Server Requires Windows Server 2008 or Windows Server 2003.


(a tout hasard, voici aussi:
Private Declare Function GetCurrentProcessId Lib "kernel32.dll" () As Integer

)
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
faut donner les nom exact de la fenêtre...
par exemple:

Word_hwnd = FindWindow(vbNullString, "Document1 - Microsoft Word")

possible aussi (mais pas top :
Word_hwnd = FindWindow("OpusApp", vbnullstring)

(Word 2003)
Messages postés
67
Date d'inscription
mardi 5 décembre 2000
Statut
Membre
Dernière intervention
5 juillet 2010

Dans mon cas j'ai ca :

    Public Function InstallHook() As Boolean
        Dim Word_hwnd As Long
        Try
            If _mouseHook = IntPtr.Zero Then
                _mouseProc = New CallBack(AddressOf MouseHookProc)
                Word_hwnd = FindWindow(vbNullString, "SEB.doc [mode de compatiblité] - Microsoft Word")
                'Word_hwnd = FindWindow("Microsoft Word", vbNullString)
                _mouseHook = SetWindowsHookExW(WH_MOUSE_LL, _mouseProc, Word_hwnd, 0)
                Dim name As String = GetWndText(Word_hwnd)

                MsgBox(name)
            End If
            Return _mouseHook <> IntPtr.Zero
        Catch ex As Exception
            MsgBox(ex.Message & vbCrLf & ex.StackTrace)
        End Try
    End Function

J'ai essayé plusieurs possibilités mais je n'ai pas trouvé.
Je travaille avec Word 2007
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
tes déclarations d'API me semblent erronées...

déjà que je vois un :
Dim Word_hwnd As Long
au lieu d'un
Dim Word_hwnd As Integer
Messages postés
67
Date d'inscription
mardi 5 décembre 2000
Statut
Membre
Dernière intervention
5 juillet 2010

J'ai changé  le Word_hwnd en Integer mais le probléme c'est que Word_hwnd me renvoit 0.
On trouve pas mal de forum ou y mettent IntPtr et ou ca marche mais c'est pas mon cas.

    Private Declare Function FindWindowByClass Lib "user32" _
    Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As Long) As Integer
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer

Ces déclarations sont peut être fausses ?
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
testé, ca fonctionne...


Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim Word_Wnd As Integer
Word_Wnd = FindWindow(vbNullString, "Document1 - Microsoft Word")
If Word_Wnd <> 0 Then
MessageBox.Show("Handle retrouvé : " & Word_Wnd.ToString())
End If
End Sub
Messages postés
67
Date d'inscription
mardi 5 décembre 2000
Statut
Membre
Dernière intervention
5 juillet 2010

En fait je vais expliquer mon probléme :
Je veux récupérer les évènements dans une page word avec du hook donc je fais

    Public Structure MSLLHOOKSTRUCT
        Public pt As Point
        Public mouseData As Integer
        Public flags As Integer
        Public time As Integer
        Public extra As IntPtr
    End Structure

    Private _mouseHook As IntPtr
    Private Const WH_MOUSE_LL As Integer = 14

  Private Delegate Function CallBack(ByVal nCode As Integer, ByVal wParam As IntPtr, ByRef lParam As MSLLHOOKSTRUCT) As Integer

    <MarshalAs(UnmanagedType.FunctionPtr)> Private _mouseProc As CallBack

  Public Function MouseHookProc(ByVal nCode As Integer, ByVal wParam As IntPtr, ByRef lParam As MSLLHOOKSTRUCT) As Int32
      
        Debug.Print("Message = {0}", wParam.ToInt32)

        Return CallNextHookEx(WH_MOUSE_LL, nCode, wParam, lParam)
    End Function

Public Function InstallHook() As Boolean
      
            If _mouseHook = IntPtr.Zero Then
                _mouseProc = New CallBack(AddressOf MouseHookProc)
                _mouseHook = SetWindowsHookExW(WH_MOUSE_LL, _mouseProc, GetModuleHandleW(IntPtr.Zero)
, 0)

            End If
            Return _mouseHook <> IntPtr.Zero
        Catch ex As Exception
            MsgBox(ex.Message & vbCrLf & ex.StackTrace)
        End Try
    End Function


  Private Declare Function CallNextHookEx Lib "user32.dll" (ByVal
idHook As Int32, ByVal nCode As Int32, ByVal wParam As IntPtr, ByRef
lParam As MSLLHOOKSTRUCT) As Int32

Ca marche trés bien pour l'écran complet mais impossible de le faire fonctionner pour ma page Word
C'est pour ca que je veux récupérer le handle.
Je récupère bien une valeur non nulle mais ca n'a pas l'air de correspondre avec la fenêtre word ..
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
non nulle ? donc c'est que c'est OK....

tu obtiens le handle de la fenetre mère...
elle contient n fenetres, dont celle (_WWG) qui affiche le document...

ouvre Spy++ pour en apprendre davantage sur la structure hierrarchique des fenetres de Word
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
l'idée est de chopper quoi, via le hook ?
Messages postés
67
Date d'inscription
mardi 5 décembre 2000
Statut
Membre
Dernière intervention
5 juillet 2010

Mais comment je peux apprendre des choses sur la structure hierrarchique des fenetres de Word avec Spy++
C'est peut être idiot comme question mais bon .. :S
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
ben lance Spy++, cible la fenetre word principale (celle dont tu recherche le handle)
tu regarde ses fenetres filles, tu espionne les messages
et tu regarde si tu cherches a "écouter" la bonne
Messages postés
67
Date d'inscription
mardi 5 décembre 2000
Statut
Membre
Dernière intervention
5 juillet 2010

En fait je veux chopper le clic gauche de la souris via le hook
Et ensuite par exemple je veux cliquer sur un composant que j aurais rajouté via un module externe et voir ses propriétés
Messages postés
67
Date d'inscription
mardi 5 décembre 2000
Statut
Membre
Dernière intervention
5 juillet 2010

Encore une question stupide :S je fais comment pour espionner les messages ?
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
Ctrl + F
tu cible la fenetre
tu choisis "Messages" dans la frame "Show"
et tu presses Ok
Messages postés
67
Date d'inscription
mardi 5 décembre 2000
Statut
Membre
Dernière intervention
5 juillet 2010

Mais apparement ca => Word_hwnd = FindWindow("OpusApp", vbNullString) je crois que ca marche puisque ca me renvoit pas quelque chose de nul donc le problème peut venir du hook peut être ?
Je suis à court d'idées la :S
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
du hook ? oui, peut etre, a voir si ton code permet de faire du hook ciblé sur une fenetre (qui necessite normallement une dll externe)
Messages postés
67
Date d'inscription
mardi 5 décembre 2000
Statut
Membre
Dernière intervention
5 juillet 2010

Ben voila le code mais je n'est pas compris cette histoire de dll externe
Mettre quoi dedans ou la créer, comment la créer ... a quoi elle peut me servir
Comment savoir si mon code permet de faire du hook cliblé sur une fenêtre ?
Je pense pas avoir tout compris sur le hook ...
Faut dire ce morceau de code je l'ai trouvé sur le net et ca marchait impec sans word
J'ai voulu le modifier pour mon code mais ca a pas donné grand chose lol :S

    Private Declare Function FindWindowByClass Lib "user32" _
    Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As Long) As Integer
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer

    Public Structure MSLLHOOKSTRUCT
        Public pt As Point
        Public mouseData As Integer
        Public flags As Integer
        Public time As Integer
        Public extra As Integer
    End Structure

    Private Sub Btn_Formulaire_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Btn_Formulaire.MouseMove

    Public Function InstallHook() As Boolean
      
            If _mouseHook = IntPtr.Zero Then
                _mouseProc = New CallBack(AddressOf MouseHookProc)
                _mouseHook = SetWindowsHookExW(WH_MOUSE_LL, _mouseProc, GetModuleHandleW(IntPtr.Zero, 0)
           
            End If
            Return _mouseHook <> IntPtr.Zero
 
    End Function

    Public Sub RemoveHook()
        If _mouseHook = IntPtr.Zero Then Return
        UnhookWindowsHookEx(_mouseHook)
        _mouseHook = IntPtr.Zero
    End Sub

 Public Function MouseHookProc(ByVal nCode As Integer, ByVal wParam As IntPtr, ByRef lParam As MSLLHOOKSTRUCT) As Integer

        Debug.Print("Message = {0}", wParam.ToInt32)

        Return CallNextHookEx(WH_MOUSE_LL, nCode, wParam, lParam)
    End Function

Merci de regarder :)
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
Messages postés
67
Date d'inscription
mardi 5 décembre 2000
Statut
Membre
Dernière intervention
5 juillet 2010

Private Const WH_MOUSE_LL As Integer = 14
On peut mettre n'importe quelle autre valeur que 14 ?
Je vois pas comment ca fonctionne
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
la doc te l'indique...
on demande un hook d'un certain type (ici souris, bas niveau)
on pourrais demander le clavier, la creation de fenetres, etc....