Автоматизация с перехватом нажатия кнопок и мыши. - страница 9

 
YuraZ >>:

SP2 XPPRO

Если на машине постоянно и много ставится софты то все что угодно может быть

если ОСЬ целевая - где крутится стабильный проверенный небольшой набор задач либо одна

т е не стоит куча программ не сносится постоянно что то и не ставится масса чего то там

то как правило проблем не бывает


У меня библиотека намного меньше оказалась. Заменил её, виидел как 1 раз получилось заменить эксперт в строке, но терминал упал. Запустил еще раз, уже не работает. Выводит -1, т.е. команда неправильная. Хотя что неправильно неясно, т.к. 1 раз то сработало.


Решил поиграться на виртуальной машине на разных операционках.

 
HIDDEN >>:

Посмотрел на компе и в сети файл библиотеки user32.dll существуют куча разных по размеру файлов.

Может быть проблема у меня в том, что библиотека сама кривая.


Ilnur, если не сложно выложи тут свою версию библиотеки, попробую с ней потестировать.

Yuraz, а у тебя получилось найти и подставить имя функции по кодам Ilnurа или моим, если не сложно свою библиотеку тоже выложи.

У меня XP Pro SP3.

Библиотеку прикрепил.

Файлы:
user32_1.zip  305 kb
 

Перепробовал выложенные библиотеки, терминал постоянно падает при запуске скрипта.

Поставил голую, чистую винду, такае же фигня, переключатель не работает хоть ты лбом тарань монитор.


Что делать незнаю. В полном тупике, опять откладывать попытку реализации до лучьших времени.....

 
// Зайцев Ю. В. YURAZ
//
// программируем на API 
// передать данные в SysDateTimePick32 можно через ХУК ,  но хуки не люблю  
// потому проколотим дату кнопками ввода
// 
// 


#define GW_HWNDNEXT                    2

#define WM_ACTIVATE                    0x0006
#define WM_ENABLE                      0x000A
#define WM_SETFOCUS                    0x0007

#define WM_KEYDOWN                     0x0100
#define WM_KEYUP                       0x0101

#define VK_TAB                         0x09
#define VK_RIGHT                       0x27


#define GW_CHILD                       5

// ID 
#define _ID_TESTER                     0x053      // дескриптор ТЕСТЕРА     
#define _ID_TW                         0x81BF     // дескриптор окна TESTERA
#define _ID_TERMINAL                   0xE81E

#define _ID_NAV                        0xE81B     // навигатор


#import "user32.dll"
   int      SendMessageA(int hWnd,int Msg,int wParam,string lParam);
   int      PostMessageA(int hWnd,int Msg,int wParam,int lParam);
   int      GetWindowTextA(int hWnd,string lpString,int nMaxCount);
   int      GetDlgItem(int hDlg, int nIDDlgItem);
   int      GetAncestor(int hWnd, int gaFlags);
   int      GetWindow(int hWnd,int uCmd);
#import


void start()
{


   int hMetaTrader = GetAncestor(WindowHandle(Symbol(),Period()),2);              // Дескриптор основного окна терминала
   Print("hMetaTrader = ", hMetaTrader," || ", DecToHex(hMetaTrader));

   int hTerminal = GetDlgItem(hMetaTrader, _ID_TERMINAL );                                // Дескриптор окна валютной пары
   Print("hTerminal = ", hTerminal," || ", DecToHex(hTerminal));

   int hTester = GetDlgItem(hTerminal, _ID_TESTER );                                     // Дескриптор окна тестера стратегий
   Print("hTester = ", hTester," || ", DecToHex(hTester));   

// хитро вычисляем окошко объекта 
   int hOt  =  GetWindow(FindHendlKey( GetDlgItem(hTester,_ID_TW), "От:" ), GW_HWNDNEXT);
   Print("hOt = ", hOt," || ", DecToHex(hOt));  // для отладки покажем HENDL окна ввода даты

//
// тупо нажимаем дату  2001.03.27
//
    SendMessageA ( hOt, WM_ACTIVATE ,       1,  0 ); // Активизируем
    SendMessageA ( hOt, WM_ENABLE   ,       1,  0 );
    SendMessageA ( hOt, WM_SETFOCUS ,       1,  0 );

 
    PostMessageA ( hOt, WM_KEYDOWN  ,       0x032   ,  1 ); //  0x32 код '2'
    Sleep(1000);
    PostMessageA ( hOt, WM_KEYDOWN  ,       0x030   ,  1 ); //  
    Sleep(1000);
    PostMessageA ( hOt, WM_KEYDOWN  ,       0x030   ,  1 ); //
    Sleep(1000);
    PostMessageA ( hOt, WM_KEYDOWN  ,       0x031   ,  1 ); // 2001 
    Sleep(1000);
    PostMessageA ( hOt, WM_KEYDOWN  ,       VK_RIGHT,  1 ); // .
    Sleep(1000);
    PostMessageA ( hOt, WM_KEYDOWN  ,       0x030   ,  1 ); // 12
    Sleep(1000);
    PostMessageA ( hOt, WM_KEYDOWN  ,       0x033   ,  1 ); // 03
    Sleep(1000);
    PostMessageA ( hOt, WM_KEYDOWN  ,       VK_RIGHT,  1 ); // .
    Sleep(1000);
    PostMessageA ( hOt, WM_KEYDOWN  ,       0x032   ,  1 ); //  27
    Sleep(1000);
    PostMessageA ( hOt, WM_KEYDOWN  ,       0x037   ,  1 ); // 
    Sleep(1000);
    SendMessageA ( hOt, WM_KEYDOWN  ,       VK_TAB  ,  0 );
    Sleep(1000);
 
}

 
 
 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string DecToHex(int n)
  {
   string s = "", c;
   while(n != 0)
     {
      if(n%16 < 10)
          c = CharToStr(n % 16 + '0');
      else 
          c = CharToStr(n % 16 + 'A'-10);
      s = c + s;
      n = n / 16;
     }
   return(s);
  }

//+------------------------------------------------------------------+
//
// прощелкать объекты
// ищем объект по имени 
//
//+------------------------------------------------------------------+

int FindHendlKey( int Current, string findname )
{
  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);
}

HIDDEN 04.05.2009 14:20



Далеее сами ... в смысле формирование нужных кодов клавиатуры,, для даты ввода


 


Возможно подходит функция LVN_COLUMNCLICK но что-то не получается.

 

Подскажите как отловить окно вызываемое по F9 (Ордер)

По тексту не ищется.

Пока его выловил следующим образом:

int hwnd=GetAncestor(WindowHandle(name,Period()),2);//main terminal handle

string s=""; 

hdlg=GetLastActivePopup(hwnd);//FindWindowA(0,s);

 if(hdlg!=hwnd){

         GetWindowTextA(hdlg,s,GetWindowTextLengthA(hdlg)+1);//работает, надо s=""   

         Print(s);

} 
 
//------------------------------------------------------------------    F9
void F9()
{
        int h=WindowHandle(Symbol(),Period());  // хэндл графика
        int hMetaTrader=GetAncestor(h, 2);  // хэндл МТ
        PostMessageA(h, WM_COMMAND, 35458, 0); // открываем F9
}

Хендл ордерного окна в русском МТ

        int h=FindWindowA ("#32770", "Ордер");

--------

Пользуйтесь Spy++ для поиска идентификаторов ресурсов в окнах

 

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

прикажете по китайски искать?) нужен другой способ.

пока вариант мною указанный работает.

 

DKeN:

пока вариант мною указанный работает.

поздравляю, чего же вы тогда хотите ?

можете в окнах искать какие то уникальные ресурсы, котоые есть только в этом по F9.

 

После FindWindowA нужно ещё проверить ID потока/процесса для найденного окна (функция GetWindowThreadProcessId), т.к. найденное окно ордера может принадлежать другой копии метатрэйдера.

Причина обращения: