API Hook? C#

10/02/2013 18:12 tobischi#1
Hallo,

ich würde mir gerne die Elemente eines Fensters von einer Anwendung anzeigen lassen. Also zum Beispiel alle Buttons oder eine drop down box usw..
Ich habe schon viel in Google gesucht aber nie etwas gefunden, was mir weitergeholfen hat.

Kann ich durch Api hooking realisieren?

Über Hilfe würde ich mich sehr freuen ( auch über einen Link zu einem tutorial oder welche "Basics" ich dafür brauche).

LG,

tobischi
10/02/2013 23:20 qkuh#2
Und was willst du damit erreichen?
10/03/2013 11:34 tobischi#3
Ich würde gerne lernen und verstehen wie das Funktioniert und dann zum Beispiel in meinem Programms die Buttons des GUI anklicken oder den Inhalt einer Listbox oder Textbox kopieren und verwenden
10/03/2013 12:52 tolio#4
das für brauchst du keinen api hook sondern musst einfach die win api nutzen, ohne anspruch auf vollständigkeit mal ein paar hinweise:
[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]
10/03/2013 13:12 qkuh#5
Ich hab vor 3 Tagen noch so ein Tool in C# geschrieben. Ist ein Manager für Bots. Kannst mich gerne mit deinem Skypenamen pm'en und ich zeig dir dann, wie das funktioniert.
10/03/2013 19:25 tobischi#6
Hab mir jetzt ne kleine Konsolenanwendung geschrieben in der ich die GetWindowText Funktion benutze. Das klappt auch, aber so bekomme ich ja nur die Caption des Fenster. Kann ich mit den Send- uns Postmessage Funktionen auch den restlichen Fensterinhalt bekommen oder wie wäre das möglich?

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        [DllImport("User32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern int GetWindowTextLength (IntPtr hWnd);


        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);


       
        static void Main(string[] args)
        {
            Process[] procs = Process.GetProcessesByName("Spotify");
            Process proc = procs[0];
            IntPtr hwnd = proc.MainWindowHandle;
            int len = GetWindowTextLength(hwnd);
            StringBuilder lpString = new StringBuilder(len + 1);
            GetWindowText(hwnd, lpString, lpString.Capacity);
            Console.WriteLine(len);
            Console.WriteLine(lpString);
            Console.ReadKey();
        }
    }
}
10/03/2013 19:31 tolio#7
wie gesagt das bsp funktionen ua zum ziel führen können, schau einfach mal durch die windows api was es da sonst noch gibt
10/04/2013 22:16 qkuh#8
Du musst [Only registered and activated users can see links. Click Here To Register...] durch alle Windows des GUI's wandern und wenn du am Control angekommen bist, dann besorgst du dir mit SendMessage (WM_GETTEXT) den Inhalt des Controls.

Hinweiß: Ich seh gerade, dass du Spotify als Testobjekt benutzt. Du kannst dir nicht von jedem Programm unbedingt jedes beliebige Control besorgen. Bei Spotify geht das zum Beispiel nicht. Am besten verwendest du Spy++ und AutoItWindowInfo. Damit sieht man das direkt.
10/08/2013 11:45 tobischi#9
Danke für die Hilfe. Habe jetzt etwas rumprobiert und kann mit dem Code den Inhalt der Drag Listbox von Control Spy auslesen. Das Handle habe ich aus dem Control Viewer und gebe es Manuell ein. Wenn ich das gleiche jetzt z.B. bei einer Listbox von spyxx oder Pokerstars probiere werden mit bei spyxx nur Fragezeichen angezeigt und bei Pokerstars Garnichts.

Weiß einer von euch woran das liegt und wie ich dieses Problem lösen könnte?
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication6
{
    class Program
    {
        [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
        public static extern int RegisterWindowMessage(string lpString);

        [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SendMessage", CharSet = System.Runtime.InteropServices.CharSet.Auto)] //
        public static extern bool SendMessage(IntPtr hWnd, uint Msg, int wParam, StringBuilder lParam);
        [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr SendMessage(int hWnd, int Msg, int wparam,
        int lparam);

        const int LB_GETTEXT = 0x0189;
        const int LB_GETTEXTLEN = 0x018A;

        static void Main(string[] args)
        {
            IntPtr hWnd = new IntPtr(0x1F04FC);
            StringBuilder title = new StringBuilder();

            // Get the size of the string required to hold the window title. 
            Int32 size = SendMessage((int)hWnd, LB_GETTEXTLEN, 0, 0).ToInt32();

            // If the return is 0, there is no title. 
            if (size > 0)
            {
                title = new StringBuilder(size + 1);

                SendMessage(hWnd, (int)LB_GETTEXT, 0, title);


            }
            Console.WriteLine(title);
            Console.ReadKey();
        }
    }
}