Захват данных из окна в стороннем приложении Win32 с закрытым исходным кодом - PullRequest
3 голосов
/ 31 марта 2010

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

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

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

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

1 Ответ

1 голос
/ 14 февраля 2012

Например, я создал приложение под названием «Пример» для вас. Затем добавил текстовое поле. это приложение на c #, но вы можете использовать этот метод и для всех приложений 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;
        }

    }
}

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

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