Захват данных из окна в стороннем приложении Win32 с закрытым исходным кодом

Я планирую создать приложение C# Windows Forms в качестве расширения для стороннего приложения Win32, но я не знаю, как это сделать прямо сейчас. Самое большее, что я получил, это то, что я знаю, что это связано с Win32 Hooking и что есть проект с открытым исходным кодом под названием EasyHook, который должен позволить мне это сделать.

Я хотел бы знать, как я могу получить текст из текстового поля или некоторые другие данные из элемента управления в стороннем приложении Win32. Текст/данные в элементе управления должны быть захвачены из работающего окна внешнего приложения в тот момент, когда пользователь нажимает кнопку.

Я думаю, что вопрос можно резюмировать следующим образом:

  1. Как вы определяете событие, к которому нужно подключиться, когда пользователь нажимает определенную кнопку?
  2. Как получить значение, отображаемое элементом управления Win32 в момент нажатия кнопки?

person Z. Albia    schedule 31.03.2010    source источник


Ответы (1)


например, я создал для вас приложение под названием «Пример». Затем добавил текстовое поле. это приложение С#, но вы можете использовать этот метод и для всех приложений Win32. Сначала создайте приложение C# с именем Example, а затем добавьте в него текстовое поле. вам нужно имя класса текстового поля, чтобы использовать это приложение. Затем создайте приложение и вставьте эти коды.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        [DllImport("user32.dll")]
        public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
        [DllImport("user32.dll")]
        public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, StringBuilder lParam);
        [DllImport("user32.dll")]
        public static extern IntPtr FindWindowEx(IntPtr Parent,IntPtr child, string classname, string WindowTitle);
        const int WM_GETTEXT = 0x00D;
        const int WM_GETTEXTLENGTH = 0x00E;
        private void Form1_Load(object sender, EventArgs e)
        {
            Process procc = GetProcByName("Example");
            // You can use spy++ to get main window handle so you don't need to use this code
            if (procc != null)
            {
                IntPtr child = FindWindowEx(procc.MainWindowHandle, IntPtr.Zero, "WindowsForms10.EDIT.app.0.2bf8098_r16_ad1", null);
                // Use Spy++ to get textbox's class name. for me it was  "WindowsForms10.EDIT.app.0.2bf8098_r16_ad1"
                int length = SendMessage(child, WM_GETTEXTLENGTH, 0, 0);
                StringBuilder text = new StringBuilder();
                text = new StringBuilder(length + 1);
                int retr2 = SendMessage(child, WM_GETTEXT, length + 1, text);
                MessageBox.Show(text.ToString());
               // now you will see  value of the your textbox on another application  

            }

        }
        public Process GetProcByName(string Name)
        {
            Process proc = null;
            Process[] processes = Process.GetProcesses();
            for (int i = 0; i < processes.Length; i++)
            { if (processes[i].ProcessName == Name)proc = processes[i]; }
            return proc;
        }

    }
}

Надеюсь, это поможет.

person opcoder    schedule 14.02.2012
comment
Нет нет Нет Нет! Используйте автоматизацию пользовательского интерфейса. Это официальный, поддерживаемый и задокументированный интерфейс для - ммм - автоматизации стороннего приложения. Вы настраиваете прослушиватель событий для кнопки и извлекаете содержимое текстового поля при его срабатывании. - person IInspectable; 21.08.2014