Скачать MetaTrader 5

API , читаем тип Edit из другого приложения ( проблема )

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Yuriy Zaytsev
16323
Yuriy Zaytsev  

не ожидал что возникнет проблема


пытаюсь API прочитать поле Edit - чужого приложения


код на Си++


/***********************************************************************

  WinMain

***********************************************************************/
int main (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    LPTSTR lpCmdLine, int nCmdShow)           
{
 
  char *p1 = "         ";

  SendMessage( (HWND)0x050A90, WM_GETTEXT, 8 , (LPARAM)p1 );
  printf (" %s ",p1);  // получаю пустую строку  ... по логике должен вытащить свой e-mail
 
  return(0);
}

 

// аналог на MQL4

#define WM_GETTEXT                     0x000D
#import "user32.dll"
 int SendMessageA (   int h, int cmd , int len  , string p );
#import

void start() 
{
  string p1 = "        ";

  SendMessageA ( 0x050A90, WM_GETTEXT, 8 ,  p1 );

  Print( p1 );


}


распринтовка дает пустую строку :-(





подкажите в чем проблема может быть


----



Андрей
1890
Андрей  

Что сходу увиделось: так писать точно нельзя:

это ссылка на буфер неизменяемой памяти,

которая подразумевается const char

> char *p1 = " _________";

Эту строчку нужно переписать вот так:

char p1[] = " _________";

getch
1754
getch  

Попробуйте так:

#import "user32.dll"
  int GetWindowTextA( int hWnd, string lpString, int nMaxCount );
  int GetWindowTextLengthA( int hWnd );
#import

//............


  GetWindowTextA(hWnd, p1, GetWindowTextLengthA(hWnd));
// .........
Yuriy Zaytsev
16323
Yuriy Zaytsev  
getch >>:

Попробуйте так:


GetWindowTextA
в документации API, эта функция не умеет читать окна чужих приложений -- задача чтоит читать из одного приложения (содержимое окошка) Edit другого!
Yuriy Zaytsev
16323
Yuriy Zaytsev  
jartmailru >>:

Что сходу увиделось: так писать точно нельзя:

это ссылка на буфер неизменяемой памяти,

которая подразумевается const char

> char *p1 = " _________";

Эту строчку нужно переписать вот так:

char p1[] = " _________";

вообще так писать можно!


есть рабочий код, проблема в том что читать надо Edit чужого приложения - а функция GwtWindowTextA не делает это - ( из описания API )


int FindHendlKey( int Current  , string findname   )
{
  // Print( "FindHendlKey" );
  // обязательно!!! оставить как есть
  string p1=  "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234";
  int temp = GetWindow( Current , GW_CHILD ); // ищем
  while ( temp != NULL )
  {
     GetWindowTextA( temp , p1 , StringLen(findname )+1 ); 
     if ( p1 == findname) // проверим а не та ли это кнопка
     {
        return( temp ); // это то что мы ищем
     }
     int r =   FindHendlKey( temp  ,   findname   ) ; // не значит не она , обойдем ее дочерние объекты
     if ( r != NULL )
     {
        return (r); // опс нашли дочку
     }
     temp = GetWindow( temp , GW_HWNDNEXT ); // проверяем следующий объект, дочерний 
  }
  return (0);
}
Андрей
1890
Андрей  

Второе, на что стоит обратить внимание- это то, что строка yzh@mail.ru = 11 символов,

т.е. буфер должен быть 12 байт, не 8

Yuriy Zaytsev
16323
Yuriy Zaytsev  
jartmailru >>:

Второе, на что стоит обратить внимание- это то, что строка yzh@mail.ru = 11 символов,

т.е. буфер должен быть 12 байт, не 8

да, это я как пример просто привел!

ответил Вам выше

я ставил как положенно - но увы ... я сначала подумал что MQL4

но когда и в Си++ тоже не получилось - увы

у самого всезнающего google - явных примеров не нашел


---

getch
1754
getch  
YuraZ >>:
в документации API, эта функция не умеет читать окна чужих приложений -- задача чтоит читать из одного приложения (содержимое окошка) Edit другого!

Здесь было бы лучше сначала попробовать, а потом уже при желании читать документацию.

Андрей
1890
Андрей  

Привожу работающий код:

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    wchar_t a[] = L"                          ";
    SendMessage((HWND)0x00040E86, WM_GETTEXT, sizeof(a), (LPARAM)a);
    return 0;
}
Немного юникодовый, но у меня с 2006-ого всё юникодовое :-)
getch
1754
getch  

Вот так точнее:

GetWindowTextA(hWnd, p1, GetWindowTextLengthA(hWnd) + 1);

Андрей
1890
Андрей  
getch >>:

Вот так точнее:

GetWindowTextA(hWnd, p1, GetWindowTextLengthA(hWnd) + 1);

buffer overrun'а на Вас нету :-)

GetWindowTextA(hWnd, p1, sizeof(p1));

Если p1 правильного типа, конечно. А не char *.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий