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

cs_sylvain230 67 Messages postés mardi 5 décembre 2000Date d'inscription 5 juillet 2010 Dernière intervention - 24 avril 2008 à 09:03 - Dernière réponse : cs_sylvain230 67 Messages postés mardi 5 décembre 2000Date d'inscription 5 juillet 2010 Dernière intervention
- 28 avril 2008 à 10:03
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 :)
Afficher la suite 

Votre réponse

42 réponses

Meilleure réponse
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 26 avril 2008 à 03:52
3
Merci
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

)

Merci Renfield 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 75 internautes ce mois-ci

Commenter la réponse de Renfield
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 24 avril 2008 à 09:34
0
Merci
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)
Commenter la réponse de Renfield
cs_sylvain230 67 Messages postés mardi 5 décembre 2000Date d'inscription 5 juillet 2010 Dernière intervention - 24 avril 2008 à 09:51
0
Merci
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
Commenter la réponse de cs_sylvain230
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 24 avril 2008 à 09:53
0
Merci
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
Commenter la réponse de Renfield
cs_sylvain230 67 Messages postés mardi 5 décembre 2000Date d'inscription 5 juillet 2010 Dernière intervention - 24 avril 2008 à 10:05
0
Merci
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 ?
Commenter la réponse de cs_sylvain230
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 24 avril 2008 à 10:13
0
Merci
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
Commenter la réponse de Renfield
cs_sylvain230 67 Messages postés mardi 5 décembre 2000Date d'inscription 5 juillet 2010 Dernière intervention - 24 avril 2008 à 10:35
0
Merci
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 ..
Commenter la réponse de cs_sylvain230
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 24 avril 2008 à 10:44
0
Merci
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
Commenter la réponse de Renfield
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 24 avril 2008 à 10:47
0
Merci
l'idée est de chopper quoi, via le hook ?
Commenter la réponse de Renfield
cs_sylvain230 67 Messages postés mardi 5 décembre 2000Date d'inscription 5 juillet 2010 Dernière intervention - 24 avril 2008 à 10:51
0
Merci
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
Commenter la réponse de cs_sylvain230
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 24 avril 2008 à 10:53
0
Merci
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
Commenter la réponse de Renfield
cs_sylvain230 67 Messages postés mardi 5 décembre 2000Date d'inscription 5 juillet 2010 Dernière intervention - 24 avril 2008 à 10:54
0
Merci
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
Commenter la réponse de cs_sylvain230
cs_sylvain230 67 Messages postés mardi 5 décembre 2000Date d'inscription 5 juillet 2010 Dernière intervention - 24 avril 2008 à 11:37
0
Merci
Encore une question stupide :S je fais comment pour espionner les messages ?
Commenter la réponse de cs_sylvain230
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 24 avril 2008 à 11:53
0
Merci
Ctrl + F
tu cible la fenetre
tu choisis "Messages" dans la frame "Show"
et tu presses Ok
Commenter la réponse de Renfield
cs_sylvain230 67 Messages postés mardi 5 décembre 2000Date d'inscription 5 juillet 2010 Dernière intervention - 24 avril 2008 à 12:03
0
Merci
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
Commenter la réponse de cs_sylvain230
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 24 avril 2008 à 12:05
0
Merci
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)
Commenter la réponse de Renfield
cs_sylvain230 67 Messages postés mardi 5 décembre 2000Date d'inscription 5 juillet 2010 Dernière intervention - 24 avril 2008 à 12:18
0
Merci
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 :)
Commenter la réponse de cs_sylvain230
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 24 avril 2008 à 12:24
Commenter la réponse de Renfield
cs_sylvain230 67 Messages postés mardi 5 décembre 2000Date d'inscription 5 juillet 2010 Dernière intervention - 24 avril 2008 à 14:01
0
Merci
Private Const WH_MOUSE_LL As Integer = 14
On peut mettre n'importe quelle autre valeur que 14 ?
Je vois pas comment ca fonctionne
Commenter la réponse de cs_sylvain230
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 24 avril 2008 à 14:34
0
Merci
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....
Commenter la réponse de Renfield

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.