IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Récuperer le Handle des FlashWindow


Sujet :

VB.NET

  1. #1
    Invité
    Invité(e)
    Par défaut Récuperer le Handle des FlashWindow
    Bonjour, vous connaissez peut-être l'API FlashWindow ?
    Elle permet de faire clignoter un programme dans la barre des tâches

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        <DllImport("user32.dll")> _
        Private Shared Function FlashWindowEx(ByRef pwfi As FLASHWINFO) As <MarshalAs(UnmanagedType.Bool)> Boolean
        End Function
    Et j'aimerais récupérer tous les Handle des fenêtres sous cet état (qui clignotent) :



    Voilà, merci pour vos futures réponses
    Dernière modification par Invité ; 28/08/2013 à 16h05.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Je ne pense pas que ce soit possible

  3. #3
    Invité
    Invité(e)
    Par défaut
    Ah bon ?
    Dommage, mais merci quand même de m'avoir répondu
    Et si quelqu'un trouve, même dans longtemps, merci de poster la solution

  4. #4
    Invité
    Invité(e)
    Par défaut
    Je pense que le seul moyen est d'intercepter l'appelle de FlashWindowEx ...
    Est-ce vraiment nécessaire de faire de l'API Hooking, si oui comment ?

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Ah oui j'avais oublié cette possibilité... par contre je ne sais pas du tout comment on fait. Il me semble qu'il faut forcément du code natif pour le faire, ce n'est pas possible de le faire entièrement en .NET.

    EDIT: jette un oeil à EasyHook, ça permet peut-être de le faire sans avoir à écrire du code natif...

  6. #6
    Invité
    Invité(e)
    Par défaut
    Merci beaucoup, je vais regarder

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,
    Effectivement, je pense qu'il n'y a pas d'autres solutions que de passer par un Api hooking et de l'injection DLL dans les processus (il faut que l'interception soit inter-process !!). J'ai regardé brièvement et trouvé quelques truc mais toujours en C++.

    C++/Win Intercept FlashWindow

    Est-ce que le jeu en vaut la chandelle ?
    Bon courage !!

    eb.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Merci beaucoup, en fait, je veux récupérer l'Handle de la fenêtre dans cet état et directement l'activer avec SetForegroundWindow

    On m'a conseillé de d'abord regarder les messages transmis avec Spy++ :

    [ame="http://www.youtube.com/watch?v=feoOz_7FI_Y"]J'ai fait une vidéo de la capture Spy++[/ame]

    En fait, ça passe de l'état actif à non actif à intervalles régulier !

  9. #9
    Invité
    Invité(e)
    Par défaut
    Je m'imaginai qu'en utilisant GetForegroundWindow, on pourrait s’apercevoir que la fenêtre clignote (et qu'elle passe d'active à inactive) ...
    Mais GetForegroundWindow fait comme si la fenêtre clignotante n'existait pas ...

  10. #10
    Invité
    Invité(e)
    Par défaut
    En suivant les conseilles de Sehnsucht (sur ProgHelp), j'ai fait un hook de ShellProc :

    En fouinant un peu plus, j'ai trouvé une bonne piste à suivre, j'ai pas poussé trop loin la recherche (pas trop le temps) donc faudra remplir les blancs mais a priori t'auras l'essentiel pour obtenir ce que tu souhaites.

    Faut placer un hook et utiliser le callback ShellProc
    Conformément à la documentation, ses paramètres te donneront tout ce qu'il te faut, dans l'ordre :

    nCode = HSHELL_REDRAW (6) -> The title of a window in the task bar has been redrawn.
    wParam (pour nCode = 6) -> A handle to the redrawn window.
    lParam (pour nCode = 6) -> The value is TRUE if the window is flashing, or FALSE otherwise.
    Et actuellement, j'en suis là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    Public Class FlashWindowHook
        Private Declare Function SetWindowsHookEx Lib "user32.dll" Alias "SetWindowsHookExA" (ByVal idHook As Integer, ByVal lpfn As CallBack, ByVal hmod As IntPtr, ByVal dwThreadId As Integer) As IntPtr
        Private Declare Function UnhookWindowsHookEx Lib "user32.dll" (ByVal hHook As IntPtr) As Integer
        Private Declare Function CallNextHookEx Lib "user32.dll" (ByVal hHook As IntPtr, ByVal nCode As Integer, ByVal wParam As IntPtr, ByRef lParam As IntPtr) As IntPtr
        'Private Declare Function GetCurrentThreadId Lib "kernel32.dll" () As Integer
        'Private Declare Function GetLastError Lib "kernel32" () As IntPtr
     
        'Events
        Public Shared Event FlashWindow(ByVal WindowHandle As IntPtr)
     
        'HookTypes
        Private Const WH_SHELL As Integer = 10
     
        'ShellHookMessages
        Private Enum ShellHookMessages
            HSHELL_WINDOWCREATED = 1
            HSHELL_WINDOWDESTROYED = 2
            HSHELL_ACTIVATESHELLWINDOW = 3
            HSHELL_WINDOWACTIVATED = 4
            HSHELL_GETMINRECT = 5
            HSHELL_REDRAW = 6
            HSHELL_TASKMAN = 7
            HSHELL_LANGUAGE = 8
            HSHELL_SYSMENU = 9
            HSHELL_ENDTASK = 10
            HSHELL_ACCESSIBILITYSTATE = 11
            HSHELL_APPCOMMAND = 12
            HSHELL_WINDOWREPLACED = 13
            HSHELL_WINDOWREPLACING = 14
        End Enum
     
        Private Shared HHookID As IntPtr = IntPtr.Zero
     
        Private Delegate Function CallBack(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
     
        Private Shared ShellProcDelegate As New CallBack(AddressOf ShellProc)
     
        Private Shared Function ShellProc(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
            If ((nCode = ShellHookMessages.HSHELL_REDRAW) AndAlso (CBool(lParam))) Then
                RaiseEvent FlashWindow(wParam)
            End If
            'Form1.RichTextBox1.Text &= vbCrLf & CStr(nCode) & " " & CStr(wParam) & " " & CStr(lParam)
            Return CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam)
        End Function
     
        Public Shared Sub Hook()
            HHookID = SetWindowsHookEx(WH_SHELL, ShellProcDelegate, IntPtr.Zero, 0)
            If (HHookID = IntPtr.Zero) Then
                'MessageBox.Show(GetLastError)
                Throw New Exception("Could not set keyboard hook !")
            End If
        End Sub
     
        Public Shared Sub UnHook()
            If (HHookID <> IntPtr.Zero) Then
                UnhookWindowsHookEx(HHookID)
            End If
        End Sub
    End Class
    Mais il me semble qu'il faut injecter une DLL ou quelque chose comme ça ...
    Car je n'ai pas les droits nécessaires :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HHookID = SetWindowsHookEx(WH_SHELL, ShellProcDelegate, IntPtr.Zero, 0)
    HHookID vaut zéro donc j'ai cherché le code de l'erreur avec GetLastError et c'est 1428 :

    Cannot set nonlocal hook without a module handle.
    Plusieurs personnes ont le même problème :

    http://stackoverflow.com/questions/1...ith-error-1428

    http://stackoverflow.com/questions/4...ookex-return-0

    Et j'ai déjà essayé en remplaçant 0 par GetCurrentThreadId(), mais c'est pour hook son propre programme !

    Vous avez des idées ?

  11. #11
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,

    Pour mettre en place un hook général au système, il faut qu'il soit placé dans une dll.
    D'ailleurs, dans un des liens que tu fournis, il y a cette réponse :
    You can't make this work as intended. The module handle must be a handle to a DLL, you are passing the handle of your EXE. Furthermore, the DLL gets injected into other processes. Which means it cannot be a DLL written in C#, those other processes don't have the CLR loaded. You must write one in a native language, like C.
    Je pense qu'en dotnet, cela va poser des problèmes ... Je ne suis pas expert en hook DotNet (je n'ai pratiqué qu'en Delphi).

    Bon courage
    eb.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Merci pour ta réponse
    En fait, je ne comprends pas que l'on ait besoin d'injecter ...
    Quelle est l'utilité de placer son Hook ailleurs que dans le programme principal et pourquoi c'est impossible en .NET ?
    Suis-je obligé de passer par là pour simplement Hook un petit programme ?

  13. #13
    Invité
    Invité(e)
    Par défaut
    J'ai trouvé des ShellHook intéressant sans injection (mais en Autoit) :

    Detect if a window is flashing

    Easy shell hooking example

    J'ai l'impression qu'il modifie carrément les DLL système !
    Vous savez comment faire ça en VB.NET ?

  14. #14
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Citation Envoyé par Patak Voir le message
    Merci pour ta réponse
    Quelle est l'utilité de placer son Hook ailleurs que dans le programme principal et pourquoi c'est impossible en .NET ?
    Suis-je obligé de passer par là pour simplement Hook un petit programme ?
    Un article MSDN sur le hook
    Et un article expliquant les difficultés du hook global en code managé :
    Using Window Messages to Implement Global System Hooks in C#

    Maintenant, je me permets une question : Quel est l'objectif final de ta recherche ? Je veux dire, est-ce pour ta culture perso ou bien y-a-t-il une finalité à tenter d'intercepter les flashing windows ? Car dans ce cas, peut-être faudrait-il trouver autre chose qui permettrait de répondre fonctionnellement à ton besoin ... Bref, pourquoi tu veux faire ça ?
    eb.

  15. #15
    Invité
    Invité(e)
    Par défaut
    est-ce pour ta culture perso ou bien y-a-t-il une finalité à tenter d'intercepter les flashing windows ?
    Un peu des deux

    en fait, je veux récupérer l'Handle de la fenêtre dans cet état et directement l'activer avec SetForegroundWindow
    J'aimerais faire un activateur de fenêtre clignotantes

    Mais c'est bon, j'ai réussi grâce à RegisterShellHookWindow

    Merci pour ton aide
    Dernière modification par Invité ; 01/09/2013 à 19h42.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment récuperer le chemin des mails reçus de Outlook ?
    Par chleuh dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 16/08/2005, 16h44
  2. Comment obtenir les Handles des boutons systèmes de Windows ?
    Par Desraux dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 22/12/2004, 22h20
  3. Comment récuperer le handle d'un TPaintBox ?
    Par nicolos dans le forum C++Builder
    Réponses: 1
    Dernier message: 05/11/2004, 08h58
  4. Comment récuperer le Handle du module courant ?
    Par gord's dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 28/06/2004, 15h26
  5. Récuperer les icons des JDialog
    Par Pro_Fete dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 17/04/2003, 13h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo