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

C# Discussion :

SendMessage() pour DBNavigator


Sujet :

C#

  1. #1
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2011
    Messages : 610
    Points : 713
    Points
    713
    Par défaut SendMessage() pour DBNavigator
    Bonsoir!

    Je me trouve dans une impasse...
    Le but est de gérer une application depuis ma propre application. N'ayant pas la main sur le code de l'application à gérer voici comment je procède:
    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
            [DllImport("user32.dll", SetLastError = true)]
            static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
            [DllImport("user32.dll")]
            public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);
            [DllImport("user32.dll", SetLastError = true)]
            static extern IntPtr GetWindow(IntPtr hWnd, GetWindow_Cmd uCmd);
            enum GetWindow_Cmd : uint
            {
                GW_HWNDFIRST = 0,
                GW_HWNDLAST = 1,
                GW_HWNDNEXT = 2,
                GW_HWNDPREV = 3,
                GW_OWNER = 4,
                GW_CHILD = 5,
                GW_ENABLEDPOPUP = 6
            }
     
            static void Main(string[] args)
            {
                  [...]
                  IntPtr hwnd3 = FindWindowEx(hwnd2, IntPtr.Zero, "TTabSheet", "Form");
                  IntPtr hwnd4 = FindWindowEx(hwnd3, IntPtr.Zero, "TMGDBNavigator", null);
                  IntPtr ptrchild = GetWindow(hwnd, GetWindow_Cmd.GW_CHILD);
                  ptrchild = GetWindow(ptrchild, GetWindow_Cmd.GW_HWNDNEXT);
                  SendMessage((int)hwnd4, WM_COMMAND, (int)ptrchild, 0);
    Les handle sont bien récupérés et validés avec Spy++...
    Or, ce "DBNavigator" possède une rangée de bouton, afin de continuer il faut absolument que je "simule" un clic sur l'un d'eux...
    J'ai essayé la manière pour cliquer un boutton, pour gérer un menu, incluant (GetMenu(),GetMenuItemID()...) sans succès
    Si une personne s'est déjà trouvée dans cette impasse, je serai ravi de connaitre l'issue

    Merci d'avance!!!

  2. #2
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2011
    Messages : 610
    Points : 713
    Points
    713
    Par défaut
    La nuit porte conseil et la fatigue nui au code...
    Il suffisait d'envoyer les bonnes commandes telle que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                SendMessage((int)hwnd4, WM_LBUTTONDOWN, 0, 0);
                SendMessage((int)hwnd4, WM_LBUTTONUP, 0, 0);
    Et le tour est joué
    Merci quand même...

    Edit : Pour la sélection (horizontale) des boutons (contrairement à précédemment où je sélectionnais le premier bouton), il faut calculer la taille de la barre bouton (pour mon cas elle correspond à la largeur de la Form):
    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
     
            [DllImport("user32.dll")]
            [return: MarshalAs(UnmanagedType.Bool)]
            static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
            [StructLayout(LayoutKind.Sequential)]
            public struct RECT
            {
                public int Left;        // x position of upper-left corner
                public int Top;         // y position of upper-left corner
                public int Right;       // x position of lower-right corner
                public int Bottom;      // y position of lower-right corner
            }
     
                [...]
                RECT rct;
                GetWindowRect(hwnd, out rct);
                int width = rct.Right - rct.Left;
                int widthButton = width / 6; //6 correspond au nombre de boutons
                int middleButton = widthButton / 2;
                [...]
     
                //Pour la suite je sélectionne le 4ième bouton en utilisant une fonction asynchrone
                PostMessage(hwndDBNav, WM_LBUTTONDOWN, 0, (4 * widthButton) - middleButton);
                PostMessage(hwndDBNav, WM_LBUTTONUP, 0, (4 * widthButton) - middleButton);
    Si ca peut aider quelqu'un

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

Discussions similaires

  1. Besoin d'aide pour SendMessage
    Par Taiby dans le forum Windows
    Réponses: 2
    Dernier message: 22/07/2010, 14h56
  2. SENDMESSAGE pour COMBOBOX (assigner une valeur string)
    Par Steff2 dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 05/05/2010, 01h54
  3. Glyph pour dbNavigator
    Par colombe dans le forum Composants VCL
    Réponses: 5
    Dernier message: 13/07/2006, 09h33
  4. Outils, cours et NOUVEAUX tutoriels pour Borland C++Builder
    Par hiko-seijuro dans le forum C++Builder
    Réponses: 10
    Dernier message: 12/03/2006, 22h33
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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