Подскажите как считать данные из текстбокса калькулятора (calc.exe) в свою прогу на си шарп.
11.03.08 00:18: Перенесено модератором из '.NET' — AndrewVK
Здравствуйте, Siga, Вы писали:
S>Подскажите как считать данные из текстбокса калькулятора (calc.exe) в свою прогу на си шарп.
Написать свой калькулятор

Будет проще и логичнее, чем считывать непонятно что непонятно откуда.
Хотя вариант с calc.exe тоже имеет право на жизнь, только под руками нет примеров.
Здравствуйте, Spiceman, Вы писали:
S>Здравствуйте, Siga, Вы писали:
S>>Подскажите как считать данные из текстбокса калькулятора (calc.exe) в свою прогу на си шарп.
S>Ctrl+C, Ctrl+V
Спасибо за подсказку

. На примере с калькулятором я хотел разобраться как в шарпе работать с хэндлами.
Думал, что калк будет достаточно простым примером. Вижу что это не так
Здравствуйте, Siga, Вы писали:
S>Спасибо за подсказку
. На примере с калькулятором я хотел разобраться как в шарпе работать с хэндлами.
S>Думал, что калк будет достаточно простым примером. Вижу что это не так
Пожалуйста
Вобщем-то такие вещи на шарпе делаются точно так же как и на C++. Вызовом функций WinAPI.
Вот как можно решить Вашу задачу:
using System;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace Example
{
class Class1
{
[DllImport("user32.dll")]
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("user32.dll", SetLastError=true, CharSet=CharSet.Auto)]
static extern int SendMessage(IntPtr hWnd, uint Msg, uint wParam, StringBuilder lParam);
private const UInt32 WM_GETTEXT = 0x000D;
private const UInt32 WM_GETTEXTLENGTH = 0x000E;
[STAThread]
static void Main(string[] args)
{
Process[] ps = Process.GetProcessesByName("calc");
if (ps.Length > 0)
{
Process p = ps[0];
IntPtr wndMain = p.MainWindowHandle;
IntPtr wndEdit = FindWindowEx(wndMain, IntPtr.Zero, "Edit", "");
int textLength = SendMessage(wndEdit, WM_GETTEXTLENGTH, 0, null);
StringBuilder text = new StringBuilder(textLength);
int lengthReaded = SendMessage(wndEdit, WM_GETTEXT, (uint)text.Capacity, text);
Console.WriteLine("Длина текста: {0}", lengthReaded);
Console.WriteLine("Текст: {0}", text.ToString());
Console.ReadLine();
}
}
}
}
S>Подскажите как считать данные из текстбокса калькулятора (calc.exe) в свою прогу на си шарп.
Самый кошерный способ -- при помощи System.Windows.Automation:
http://rsdn.ru/forum/message/2870924.1.aspxАвтор: mihailik
Дата: 12.03.08
Здравствуйте, Spiceman, Вы писали:
S>Здравствуйте, Siga, Вы писали:
S>>Спасибо за подсказку
. На примере с калькулятором я хотел разобраться как в шарпе работать с хэндлами.
S>>Думал, что калк будет достаточно простым примером. Вижу что это не так
S>Пожалуйста
S>Вобщем-то такие вещи на шарпе делаются точно так же как и на C++. Вызовом функций WinAPI.
S>Вот как можно решить Вашу задачу:
S>S>using System;
S>using System.Text;
S>using System.Diagnostics;
S>using System.Runtime.InteropServices;
S>namespace Example
S>{
S> class Class1
S> {
S> [DllImport("user32.dll")]
S> static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
S> [DllImport("user32.dll", SetLastError=true, CharSet=CharSet.Auto)]
S> static extern int SendMessage(IntPtr hWnd, uint Msg, uint wParam, StringBuilder lParam);
S> private const UInt32 WM_GETTEXT = 0x000D;
S> private const UInt32 WM_GETTEXTLENGTH = 0x000E;
S> [STAThread]
S> static void Main(string[] args)
S> {
S> Process[] ps = Process.GetProcessesByName("calc");
S> if (ps.Length > 0)
S> {
S> Process p = ps[0];
S> IntPtr wndMain = p.MainWindowHandle;
S> IntPtr wndEdit = FindWindowEx(wndMain, IntPtr.Zero, "Edit", "");
S> int textLength = SendMessage(wndEdit, WM_GETTEXTLENGTH, 0, null);
S> StringBuilder text = new StringBuilder(textLength);
S> int lengthReaded = SendMessage(wndEdit, WM_GETTEXT, (uint)text.Capacity, text);
S> Console.WriteLine("Длина текста: {0}", lengthReaded);
S> Console.WriteLine("Текст: {0}", text.ToString());
S> Console.ReadLine();
S> }
S> }
S> }
S>}
S>
Огромное спасибо за рабочий пример