WinApi считать данные из стороннего приложения - C#
Формулировка задачи:
Всем привете! Ребят, выручайте. Мне необходимо по нажатию клавиши вытащить номер входящего вызова из программы X-lite(прога для IP телефонии).
Что я значится делаю:
подключаю значится необходимое для работы
и по нажатию на кнопку(на сколько я понимаю) получаю дискрипторы приложения(хотя сам не понимаю, че это за х.. ну условно ИДинтификаторы окна и всех объектов в нем )
Как мне теперь вытащить данные из X-lite. Если потыкать на окно X-lite'a программой Spy++, то она не видит каких либо объектов в ней, только воспринимает всю программу как одно целое(то есть нет ни label, textbox и подобных объектов нет).
Как мне выйти из этой ситуации. Может кто объяснит, все ли вообще я правильно понимаю и как в данном случае вытащить текст?
И на сколько я понимаю вытащить текст из программы мне теперь необходимо с помощью SendMessage..
[DllImport("user32.dll")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr i);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, [Out] StringBuilder lParam);
public static List<IntPtr> GetChildWindows(IntPtr parent)
{
List<IntPtr> result = new List<IntPtr>();
GCHandle listHandle = GCHandle.Alloc(result);
try
{
EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle));
}
finally
{
if (listHandle.IsAllocated)
listHandle.Free();
}
return result;
} List<IntPtr> ls = new List<IntPtr>();
string enum_ = string.Empty;
IntPtr hWnd = FindWindow(null, "X-lite");
if (!hWnd.Equals(IntPtr.Zero))
{ ls = GetChildWindows(hWnd);}
Array.ForEach(ls.ToArray(), i => enum_ += i.ToString() + Environment.NewLine );
richTextBox1.AppendText(enum_);Решение задачи: «WinApi считать данные из стороннего приложения»
textual
Листинг программы
IntPtr.Add(process.MainModule.BaseAddress, 0xfff)