Window handle
От: Siga  
Дата: 10.03.08 20:26
Оценка:
Подскажите как считать данные из текстбокса калькулятора (calc.exe) в свою прогу на си шарп.



11.03.08 00:18: Перенесено модератором из '.NET' — AndrewVK
Re: Window handle
От: muse Россия  
Дата: 11.03.08 03:08
Оценка:
Здравствуйте, Siga, Вы писали:

S>Подскажите как считать данные из текстбокса калькулятора (calc.exe) в свою прогу на си шарп.


Написать свой калькулятор Будет проще и логичнее, чем считывать непонятно что непонятно откуда.
Хотя вариант с calc.exe тоже имеет право на жизнь, только под руками нет примеров.
Люблю повеселиться, особенно пожрать
Re: Window handle
От: Spiceman  
Дата: 11.03.08 08:19
Оценка:
Здравствуйте, Siga, Вы писали:

S>Подскажите как считать данные из текстбокса калькулятора (calc.exe) в свою прогу на си шарп.


Ctrl+C, Ctrl+V
Re[2]: Window handle
От: Siga  
Дата: 11.03.08 10:21
Оценка:
Здравствуйте, Spiceman, Вы писали:

S>Здравствуйте, Siga, Вы писали:


S>>Подскажите как считать данные из текстбокса калькулятора (calc.exe) в свою прогу на си шарп.


S>Ctrl+C, Ctrl+V


Спасибо за подсказку . На примере с калькулятором я хотел разобраться как в шарпе работать с хэндлами.
Думал, что калк будет достаточно простым примером. Вижу что это не так
Re[3]: Window handle
От: Spiceman  
Дата: 11.03.08 13:25
Оценка:
Здравствуйте, 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();
            }
        }
    }
}
Re: Window handle
От: mihailik Украина  
Дата: 12.03.08 00:40
Оценка:
S>Подскажите как считать данные из текстбокса калькулятора (calc.exe) в свою прогу на си шарп.

Самый кошерный способ -- при помощи System.Windows.Automation:

http://rsdn.ru/forum/message/2870924.1.aspx
Автор: mihailik
Дата: 12.03.08
Re[4]: Window handle
От: Siga  
Дата: 12.03.08 21:07
Оценка:
Здравствуйте, 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>


Огромное спасибо за рабочий пример
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.