Использование дескрипторов для извлечения данных из внешнего приложения

Мне нужно извлечь данные из внешнего приложения, используя дескрипторы. Моя проблема в том, что если приложение закрывается и снова открывается, HWND каждый раз меняется, поэтому я думал о подключении к его имени windowClass, и все хорошо, пока я не узнал об этом; это конкретное внешнее приложение имеет метки, из которых мне нужно прочитать данные, с тем же именем windowClass в этом случае WindowsForms10.STATIC.app.0.378734aМне нужно найти способ извлечения данных из ярлыков внешних приложений правильным способом, и я не уверен, как это сделать.

Вот что я попробовал:

Чтобы получить данные через HWND:

 public partial class Form1 : Form
{
    private const int WM_GETTEXT = 13;

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string lclassName, string windowTitle);

    [DllImport("user32.dll")]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    internal delegate int WindowEnumProc(IntPtr hwnd, IntPtr lparam);

    [DllImport("user32.dll")]
    internal static extern bool EnumChildWindows(IntPtr hwnd, WindowEnumProc func, IntPtr lParam);

    public delegate bool Win32Callback(IntPtr hwnd, IntPtr lParam);


    public Form1()
    {
        InitializeComponent();
    }

    private async void button1_Click_1(object sender, EventArgs e)
    {     
        for (;;)
        {
            await Task.Delay(1000);
            DateTime date = DateTime.Now;
            label3.Text = date.ToString();            
            IntPtr firstHandle = new IntPtr(0x00020232);
            IntPtr Hwnd = FindWindow(null, "Form1");
            IntPtr Handle = Marshal.AllocHGlobal(100);
            int NumText = (int)SendMessage(firstHandle, WM_GETTEXT, (IntPtr)50, Handle);
            string Text = Marshal.PtrToStringUni(Handle);
            label1.Text = Text;

        }

    }
}

Чтобы получить данные через имя WindowClass

 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_1(object sender, EventArgs e)
        {
            for (;;)
            {
                Process procc = GetProcByName("Form1");

                if (procc != null)
                {
                    IntPtr child = FindWindowEx(procc.MainWindowHandle, IntPtr.Zero, "WindowsForms10.STATIC.app.0.378734a", null);
                    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);
                    label1.Text = text.ToString();
                }
            }
        }
        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;
        }


    }
}

И это те данные, которые я получил с двух разных ярлыков с помощью Windows Detective.

Label1:

 <?xml version="1.0" encoding="UTF-8"?>
    <!--
    Properties for window WindowsForms10.STATIC.app.0.378734a (0x002E04AA)
    Created by Window Detective
    -->
    <window>
        <windowClass>
            <name>WindowsForms10.STATIC.app.0.378734a</name>
            <classExtraBytes>0</classExtraBytes>
            <windowExtraBytes>4</windowExtraBytes>
            <brush>none</brush>
        </windowClass>
        <handle>0x002E04AA</handle>
        <parentHandle>0x003404EE</parentHandle>
        <windowText>Front Pressure</windowText>
        <dimensions>
            <rect x="146" y="177" width="198" height="27"/>
        </dimensions>
        <clientDimensions>
            <rect x="146" y="177" width="198" height="27"/>
        </clientDimensions>
        <styleBits>1442840589</styleBits>
        <extendedStyleBits>0</extendedStyleBits>
        <font>none</font>
        <windowPropsList/>
        <ownerProcessId>2960</ownerProcessId>
        <ownerThreadId>2964</ownerThreadId>
    </window>

Label2:

<?xml version="1.0" encoding="UTF-8"?>
<!--
Properties for window WindowsForms10.STATIC.app.0.378734a (0x00020232)
Created by Window Detective
-->
<window>
    <windowClass>
        <name>WindowsForms10.STATIC.app.0.378734a</name>
        <classExtraBytes>0</classExtraBytes>
        <windowExtraBytes>4</windowExtraBytes>
        <brush>none</brush>
    </windowClass>
    <handle>0x00020232</handle>
    <parentHandle>0x0002022E</parentHandle>
    <windowText>12.0 kg</windowText>
    <dimensions>
        <rect x="146" y="205" width="198" height="24"/>
    </dimensions>
    <clientDimensions>
        <rect x="146" y="205" width="198" height="24"/>
    </clientDimensions>
    <styleBits>1442840717</styleBits>
    <extendedStyleBits>0</extendedStyleBits>
    <font>none</font>
    <windowPropsList/>   
    <ownerProcessId>2960</ownerProcessId>
    <ownerThreadId>2964</ownerThreadId>
</window>

Как мне решить эту проблему? Как правильно извлечь необходимые данные?

PS Единственное отличие, которое я смог найти, - это разные размеры, но даже если вы откроете и закроете приложение, они останутся прежними, но я не знаю, как я могу зацепить их с помощью ручек.

0 ответов

Другие вопросы по тегам