Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Получить текст лэйбла или текстового поля с другого окна

20K
25 июня 2008 года
infolex
16 / / 10.05.2007
Мне нужна такая штука: запускаю я свою прогу. Запускаю совсем леввую прогу. Навожу на форме левой проги курсор на лэйбл или текстовое поле, а на форме моей проги показывается текст того лэйбла. Как это раелизовать? Помогите!
1.9K
25 июня 2008 года
max_dark
256 / / 11.11.2005
Копай в сторону SetWindowsHookEx/WH_MOUSE и GetWindowText
342
25 июня 2008 года
Yos
209 / / 21.06.2003
контроль курсора (где угодно в цикле если не надо через хуки)

 
Код:
POINT coords;
GetCursorPos(&coords);


получение текста (в принципе мона еще котроль на что за окно сделать, что бы лишние не хватать)

 
Код:
GetWindowText(WindowFromPoint(&coords),string,...);


Но скорее всего придется добавить преобразование координат в оконные и делать

 
Код:
hw = WindowFromPoint(&coords)
ScreenToClient(hw,&coords);
GetWindowText(ChildWindowFromPoint(hw,&coords),string,...);


Кстати если через хуки - "локально установленный" не будет обрабатывать чужие окна
20K
25 июня 2008 года
infolex
16 / / 10.05.2007
Цитата: Yos
контроль курсора (где угодно в цикле если не надо через хуки)

 
Код:
POINT coords;
GetCursorPos(&coords);


получение текста (в принципе мона еще котроль на что за окно сделать, что бы лишние не хватать)

 
Код:
GetWindowText(WindowFromPoint(&coords),string,...);


Но скорее всего придется добавить преобразование координат в оконные и делать

 
Код:
hw = WindowFromPoint(&coords)
ScreenToClient(hw,&coords);
GetWindowText(ChildWindowFromPoint(hw,&coords),string,...);


Кстати если через хуки - "локально установленный" не будет обрабатывать чужие окна


Код:
[DllImport("user32.dll")]
private static extern IntPtr WindowFromPoint(POINT Point);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, uint msg, int wParam, int lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern bool ScreenToClient(IntPtr hWnd, out POINT lpPoint);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowText(IntPtr hWnd, out string lpString, int nMaxCount);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr ChildWindowFromPoint(IntPtr hWndParent, POINT Point);

[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
      public int x;
      public int y;
}

private void Tick()
{
      try
      {
             POINT pt=new POINT();
             pt.x=Control.MousePosition.X;
             pt.y=Control.MousePosition.Y;

             IntPtr hw = WindowFromPoint(pt);
             ScreenToClient(hw, out pt);
             string str;
             GetWindowText(ChildWindowFromPoint(hw, pt), out str, 255);
             System.Diagnostics.Debug.WriteLine(str);
       }
       catch { }
}


он при наведении на лейбл ругается на строчку GetWindowText(ChildWindowFromPoint(hw, pt), out str, 255);

The runtime has encountered a fatal error. The address of the error was at 0x79ef067e, on thread 0x10e4. The error code is 0xc0000005. This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack.
14
27 июня 2008 года
Phodopus
3.3K / / 19.06.2008
str не проинициализирована, где сказано что она способна вместить в себя 255 символов?
лучше использовать фиксированный массив char-ов
20K
28 июня 2008 года
infolex
16 / / 10.05.2007
Цитата: Phodopus
str не проинициализирована, где сказано что она способна вместить в себя 255 символов?
лучше использовать фиксированный массив char-ов

Да уже и так объявлял

 
Код:
string str=new string('0', textLeight);
все равно эту лшибку выдает. Я уже сдался. Мучился 4 суток. Рассчитываю только на вашу помощь:)
1.9K
28 июня 2008 года
max_dark
256 / / 11.11.2005
string здесь не прокатывает, т.к. string - это КЛАСС, а нужен МАССИВ СИМВОЛОВ
 
Код:
HWND hwnd=ChildWindowFromPoint(hw, pt);
int len = GetWindowText(hwnd, NULL, 0);
TCHAR lstr=new TCHAR[len+1];
GetWindowText(hwnd, lstr, len);
// Рабораем со строчкой
// ...........
delete [] lstr;
14
30 июня 2008 года
Phodopus
3.3K / / 19.06.2008
попробуй как-нибудь так: (подсмотрено на http://pinvoke.net)

StringBuilder sb = new StringBuilder(255);
GetWindowText(ChildWindowFromPoint(hw, pt), sb, 255);
windowtext = sb.ToString(0, len);
41K
09 августа 2008 года
vchesnokov
1 / / 09.08.2008
Цитата: Phodopus
попробуй как-нибудь так: (подсмотрено на http://pinvoke.net)

StringBuilder sb = new StringBuilder(255);
GetWindowText(ChildWindowFromPoint(hw, pt), sb, 255);
windowtext = sb.ToString(0, len);



Так тоже не работает, к сожалению.
В коде ниже пробовал три варианта: StringBuilder, string и char[] - всё равно выходит ошибка:
FatalExecutionEngineError was detected
Message: The runtime has encountered a fatal error. The address of the error was at 0x79e71bd7, on thread 0x210. The error code is 0xc0000005. This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack.

Код:
private static bool OnChildWindowEnum(IntPtr hWnd, IntPtr lParam)
                {
                        UnmanagedCode.WINDOWINFO info = new UnmanagedCode.WINDOWINFO();
                        info.cbSize = (uint)Marshal.SizeOf(info);
                        UnmanagedCode.GetWindowInfo(hWnd, ref info);
                        int textLenght = UnmanagedCode.GetWindowTextLength(hWnd);
                        //StringBuilder strBldr = new StringBuilder(textLenght + 1);
                        char[] strBldr = new char[textLenght + 1];
                        //string strBldr = new string(' ', textLenght + 1);
                        UnmanagedCode.GetWindowText(hWnd, out strBldr, textLenght); // ERROR !!!
                        bool wndIsActive = info.dwWindowStatus == UnmanagedCode.WS_ACTIVECAPTION;
                        //Console.WriteLine("Window #{0} Text: \"{1}\" Is Active: {2}", ++wndCount, strBldr.ToString(), wndIsActive);
                        MessageBox.Show(string.Format("Window #{0} Text: \"{1}\" Is Active: {2}", ++wndCount, strBldr.ToString(), wndIsActive)
                                , "Сообщение"
                                , MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        //strBldr.Length = 0; // kind of the dispose  
                        if (wndIsActive)
                        {
                                // stop enumeration
                                return false;
                        }
                        return true;
                }
341
09 августа 2008 года
Der Meister
874 / / 21.12.2007
А с чего вы взяли, что в объявлении нужно указывать out string... ?
 
Код:
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowText(IntPtr hWnd, string lpString, int nMaxCount);

string s = new string('\0', 255);
GetWindowText(hwnd, s, 255);

Либо так:
 
Код:
[DllImport("user32.dll", CharSet = CharSet.Unicode]
public static extern int GetWindowText(IntPtr hWnd, char[] lpString, int nMaxCount);

char[] charArray = new char[255];
GetWindowText(hwnd, charArray, charArray.Length);
string text = new string(charArray);
Не знаю, насколько безопасно передавать экземпляр объекта StringBuilder в неуправляемые функции, но результат выполнения кода
 
Код:
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern int GetWindowText(IntPtr hWnd, StringBuilder sb, int nMaxCount);

StringBuilder sb = new StringBuilder(255);
GetWindowText((IntPtr)0x00030660, sb, sb.MaxCapacity);
string s = sb.ToString();
выглядит более предпочтительным потому, что нулевых символов после выполнения в строке не остаётся. Однако, с одной даже логической точки зрения передавать StringBuilder вместо string некорректно, и вообще подобные махинации с типами данных я склонен называть магией. В данном случае, достаточно определить длину строки с помощью GetWindowTextLength().
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог