Получение управляющей информации из другого приложения из события MouseDown / Up - PullRequest
0 голосов
/ 08 января 2020

Я работаю над созданием приложения, похожего на Windows Регистратор шагов (WSR), но с большим количеством функций, которые требуются моей компании. Я почти все сделал, но с чем я борюсь, так это с извлечением элементов управления Text / Names, нажимаемых в других приложениях.

Например, при использовании WSR, если вы нажмете кнопку с надписью OK в другом приложении, он может выбрать это и автоматически сделает комментарий к этому шагу, например, «Пользователь щелкнет левой кнопкой мыши по ОК»

Кто-нибудь знает Как я могу получить эту информацию, используя указатель окна / расположение указателя мыши (x, y)?

Другой пример, который я могу привести, - это использование инструмента Информация о окне AutoIT

AutoIt Window Info

Как видно на рисунке выше, AutoIt может извлекать информацию об элементах в приложениях с помощью Finder Tool.

Если кто-то может дать мне указатель на то, как это достигается с помощью C#, это было бы здорово, поскольку в настоящее время я не знаю, с чего начать. Все остальные примеры, которые я нашел в Интернете, предназначены для возврата контрольных значений из приложения, а не из фоновых приложений.

Я создаю свое приложение в WinForms из-за того, что некоторые из используемых им пространств имен не совместимы с WPF.

Это будет случай использования Enum Windows () и EnumChild Windows () ??

Примечание: Мне не нужна помощь с мышью крючки et c. просто получение информации из элемента управления, на который был нажат.

Спасибо, Мейси

1 Ответ

0 голосов
/ 08 января 2020

Эй, ребята, мне удалось получить текстовую информацию. Это может быть не самый красивый способ сделать это, но это работает.

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;

namespace EnumChildWinTest
{
    public partial class Form1 : Form
    {
        public IntPtr windowHandle = IntPtr.Zero;      // Default value

        public Form1()
        {
            InitializeComponent();
        }

        [DllImport("user32.dll")] private static extern int GetWindowText(int hWnd, StringBuilder title, int size);
        StringBuilder title = new StringBuilder(256);


        // Go Button
        private void button1_Click(object sender, EventArgs e)
        {


            textBox1.Clear();
            textBox1.AppendText($"Window Handle: {GetWindowHandle(textBox2.Text)} {Environment.NewLine}");

            foreach (var child in GetChildWindows(windowHandle))
            {
                textBox1.AppendText($"Child window: {child.ToString()} {Environment.NewLine}");
                GetWindowText(child.ToInt32(), title, 256);
                textBox1.AppendText($"Title:{title}{Environment.NewLine}");
            }
        }

        public IntPtr GetWindowHandle(string processName)
        {

            Process[] processes = Process.GetProcessesByName(processName);

            foreach (Process p in processes)
            {
                windowHandle = p.MainWindowHandle;
            }

            return windowHandle;
        }

        public List<IntPtr> GetChildWindows(IntPtr handle)
        {
            var allChildWindows = new WindowHandleInfo(windowHandle).GetAllChildHandles();

            return allChildWindows;
        }
    }
}

public class WindowHandleInfo
{
    private delegate bool EnumWindowProc(IntPtr hwnd, IntPtr lParam);

    [DllImport("user32")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr lParam);

    private IntPtr _MainHandle;

    public WindowHandleInfo(IntPtr handle)
    {
        this._MainHandle = handle;
    }

    public List<IntPtr> GetAllChildHandles()
    {
        List<IntPtr> childHandles = new List<IntPtr>();

        GCHandle gcChildhandlesList = GCHandle.Alloc(childHandles);
        IntPtr pointerChildHandlesList = GCHandle.ToIntPtr(gcChildhandlesList);

        try
        {
            EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
            EnumChildWindows(this._MainHandle, childProc, pointerChildHandlesList);
        }
        finally
        {
            gcChildhandlesList.Free();
        }

        return childHandles;
    }

    private bool EnumWindow(IntPtr hWnd, IntPtr lParam)
    {
        GCHandle gcChildhandlesList = GCHandle.FromIntPtr(lParam);

        if (gcChildhandlesList == null || gcChildhandlesList.Target == null)
        {
            return false;
        }

        List<IntPtr> childHandles = gcChildhandlesList.Target as List<IntPtr>;
        childHandles.Add(hWnd);

        return true;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...