kostenloser Webspace werbefrei: lima-city


C# auf fremde form zugreifen

lima-cityForumProgrammiersprachenProgrammieren mit .NET & Mono

  1. Autor dieses Themas

    ventos

    Kostenloser Webspace von ventos

    ventos hat kostenlosen Webspace.

    Hi,
    Ich habe ein c# programm, dass einem anderen . Net- programm klick events bestimmter buttons sende. Klar, send message, buttonid... Meine frage: kann ich auh einfach an das handle des buttons rankommen( dank .net) ?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hallo,

    man kommt an den Handle, aber einfach sieht das nicht aus:

    class Program
        {
            static void Main(string[] args)
            {
                foreach (Process procesInfo in Process.GetProcesses())
                {
                    if (procesInfo.ProcessName == "WindowsFormsApplication1")
                    {
    
                        Console.WriteLine("process {0} {1:x}", procesInfo.ProcessName, procesInfo.Id);
    
                        foreach (ProcessThread threadInfo in procesInfo.Threads)
                        {
                            IntPtr[] windows = GetWindowHandlesForThread(threadInfo.Id);
    
                            if (windows != null && windows.Length > 0)
                            {
                                foreach (IntPtr hWnd in windows)
                                {
                                    Console.WriteLine("\twindow {0:x} text:{1} caption:{2}",
                                        hWnd.ToInt32(), GetText(hWnd), GetEditText(hWnd));
                                }
                            }
                        }
                    }
                }
    
                Console.ReadLine();
            }
    
            private static IntPtr[] GetWindowHandlesForThread(int threadHandle)
            {
                _results.Clear();
                EnumWindows(WindowEnum, threadHandle);
                return _results.ToArray();
            }
    
            // enum windows
    
            private delegate int EnumWindowsProc(IntPtr hwnd, int lParam);
    
            [DllImport("user32.Dll")]
            private static extern int EnumWindows(EnumWindowsProc x, int y);
            [DllImport("user32")]
            private static extern bool EnumChildWindows(IntPtr window, EnumWindowsProc callback, int lParam);
            [DllImport("user32.dll")]
            public static extern int GetWindowThreadProcessId(IntPtr handle, out int processId);
    
            private static List<IntPtr> _results = new List<IntPtr>();
    
            private static int WindowEnum(IntPtr hWnd, int lParam)
            {
                int processID = 0;
                int threadID = GetWindowThreadProcessId(hWnd, out processID);
                if (threadID == lParam)
                {
                    _results.Add(hWnd);
                    EnumChildWindows(hWnd, WindowEnum, threadID);
                }
                return 1;
            }
    
            // get window text
    
            [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
            static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
            [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
            static extern int GetWindowTextLength(IntPtr hWnd);
    
            private static string GetText(IntPtr hWnd)
            {
                int length = GetWindowTextLength(hWnd);
                StringBuilder sb = new StringBuilder(length + 1);
                GetWindowText(hWnd, sb, sb.Capacity);
                return sb.ToString();
            }
    
            // get richedit text 
    
            public const int GWL_ID = -12;
            public const int WM_GETTEXT = 0x000D;
    
            [DllImport("User32.dll")]
            public static extern int GetWindowLong(IntPtr hWnd, int index);
            [DllImport("User32.dll")]
            public static extern IntPtr SendDlgItemMessage(IntPtr hWnd, int IDDlgItem, int uMsg, int nMaxCount, StringBuilder lpString);
            [DllImport("User32.dll")]
            public static extern IntPtr GetParent(IntPtr hWnd);
    
            private static StringBuilder GetEditText(IntPtr hWnd)
            {
                Int32 dwID = GetWindowLong(hWnd, GWL_ID);
                IntPtr hWndParent = GetParent(hWnd);
                StringBuilder title = new StringBuilder(128);
                SendDlgItemMessage(hWndParent, dwID, WM_GETTEXT, 128, title);
                return title;
            }
        }

    bei "if (procesInfo.ProcessName == "WindowsFormsApplication1")" brauchst du nur den Namen anpassen und wirst alle Handles des Programmes finden.
    Mit Windows-Forms sollte das kein Problem darstellen, wie es bei WPF ist kann ich dir gerade nicht sagen, da ich es damit nicht getestet hab.

    Gruß
    Trancedrome

  4. Hi,
    falls das Thema noch Aktuell ist: hast du dir schonmal die WinApi durchgeguckt? Es gibt da ziemlich viele nützliche Funktionen die in der kernel32.dll sind, besonders wenn es ums memory-editing geht
    LG
    DevHex
  5. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!