Использование дескрипторов для извлечения данных из внешнего приложения
Мне нужно извлечь данные из внешнего приложения, используя дескрипторы. Моя проблема в том, что если приложение закрывается и снова открывается, 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 Единственное отличие, которое я смог найти, - это разные размеры, но даже если вы откроете и закроете приложение, они останутся прежними, но я не знаю, как я могу зацепить их с помощью ручек.