버튼 및 마우스 클릭을 가로채는 자동화. - 페이지 8

 

그들이 말했듯이 몇 가지 경우를 해결하는 것은 꽤 남아 있습니다.

여러분, 이 까다로운 WinAPI는 전문가를 위한 것이 아닙니다. 그와 처음으로 작업.


2가지에 매달렸습니다.


1. Expert Advisors 목록이 있는 ComboBox에서 Expert Advisor의 이름으로 줄 번호를 반환하는 방법 .


나는 이렇게 한다


 #define CB_FINDSTRING 0x014C
#define CB_SETCURSEL  0x014E

hMetaTrader = GetAncestor ( WindowHandle ( Symbol ( ) , Period ( ) ) , 2 ) ;                // Дескриптор основного окна терминала
hTerminal = GetDlgItem ( hMetaTrader , 0xE81E ) ;                                  // Дескриптор окна валютной пары
hTester = GetDlgItem ( hTerminal , 0x53 ) ;                                        // Дескриптор окна тестера стратегий
ExpertsComboBox = GetDlgItem ( GetDlgItem ( hTester , 0x81BF ) , 0x468 ) ;              // Дескриптов списка экспертов

int exep = SendMessageA ( ExpertsComboBox , 0x014C , 0 , "Test_Expert" ) ;
Print ( "Строка № " , exep ) ;

0을 반환하면 됩니다. InqSoft 프로그램에서 동일한 작업을 수행하지만 Windows Scaner는 줄 번호를 반환합니다.


다음으로 나는 기능을 사용한다


SendMessageA(ExpertsComboBox, 0x014E, 12, 0);                              // Установка эксперта

모든 것이 제대로 작동하지만 아직 이 숫자 12를 얻는 방법을 모르겠습니다.


2. 날짜 붙여넣기 문제입니다. 유라즈님, 설명을 좀 해주셨는데 어떻게 접근해야 할지 모르겠네요. 클릭으로도 여전히 방법을 모르겠습니다.


얘들 아, 자동 최적화 프로그램의 출시를 완료하도록 도와주세요. 작업 코드를 보낼 것을 약속합니다. 그런 다음 저장된 HTML의 구문 분석과 결과의 대체를 전문가에게 고정하고 싶습니다. 후자는 문제가 없지만이 테스터의 출시는 이미 마모되었습니다. 나는 갈까마귀를 올바른 위치에 놓고 단추를 찌르는 법을 배웠지만 내가 설명한 것을 이길 수 없습니다.


완료 및 확인 후 모든 것을 기사 형식으로 정리하고 싶습니다. 개발자가이 정보를 놓치는 사실은 아니지만 많은 사람들에게이 기능이 유용 할 것이라고 생각합니다.

 
HIDDEN >> :

옵션으로


당신은 거기에 얼마나 많은 라인이 있는지 세어서는 안되며 여전히 어떻게 든 고통을 겪습니다.

목록에서 우리 전문가 "우리 영웅 전문가"를 검색하십시오.

논리적으로 카운터를 만들면 목록에서 숫자를 올릴 수도 있습니다.

목록의 맨 위를 찾아 아래로 실행하거나 맨 아래를 찾아 위로 실행하면 됩니다.

 //+------------------------------------------------------------------+
//|                                                                  |
//|                                           YURAZ Copyright © 2008 |
//|                         www.mail.ru yzh@mail.ru yyuraz@gmail.com |
//+------------------------------------------------------------------+
#property copyright "YURAZ Copyright © 2008"
#property link       "www.mail.ru yzh@mail.ru yyuraz@gmail.com"
#include <WinUser32.mqh>
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start ( )
   {
//----
   
#define CB_FINDSTRING 0x014C
#define CB_SETCURSEL   0x014E

int hMetaTrader = GetAncestor ( WindowHandle ( Symbol ( ) , Period ( ) ) , 2 ) ;                // Дескриптор основного окна терминала
int hTerminal = GetDlgItem ( hMetaTrader , 0xE81E ) ;                                  // Дескриптор окна валютной пары
int hTester = GetDlgItem ( hTerminal , 0x53 ) ;                                        // Дескриптор окна тестера стратегий
int ExpertsComboBox = GetDlgItem ( GetDlgItem ( hTester , 0x81BF ) , 0x468 ) ;              // Дескриптов списка экспертов



/// ищем нашего героя условие мы должны стоять на первом в списке
{ 

  string p1 =    "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234" ;

  GetWindowTextA ( ExpertsComboBox , p1 , 250 ) ;
 

   
  
   Print ( "Имя текущего эксперта " , p1     ) ;
 // можно в цикле пощелкать и найти 
  if ( p1 != "имя нашего героя")
      PostMessageA (ExpertsComboBox, WM_KEYDOWN,VK_DOWN, 0); // Сместились на нужную строчку.
  esle
     // break from  
 }
 
//   если последний толчок клавиши выдает то же самое имя - тормозим цикл
//  это все на уровни идеи описал..  обрисуйте как Вам надо сами
//  ну в смысле текст оформите сами...
//  учтите что если по умолчанию вы стоите в конце списка или в середине ... то логично пробежать список вверх
// а потом вниз   


    return ( 0 ) ;
   }
 
 
// прощелкать объекты

// ищем объект по имени 
int FindHendlMessage( 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);
}

// тут рекурсия - стек должен быть с запасом

//  вставить в начало - мне хватало 4048
#property stacksize   4048 // внимание это обязательно для рекурсии ( пока не замеченно косяков при стеке 4048

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);
}

 
YuraZ >> :


감사합니다. 더 자세히 알아보겠습니다.

 
HIDDEN >> :

그들이 말하는 것처럼 몇 가지 경우를 해결하는 것은 꽤 남아 있습니다.

여러분, 이 까다로운 WinAPI는 전문가를 위한 것이 아닙니다. 그와 처음으로 작업.

코드가 정확하므로 작동해야 합니다. 이 코드는 문제 없이 작동합니다.

오류가 발생하면 함수는 일반적으로 0이 아닌 -1을 반환합니다. 코드에 오류가 있을 수 있습니다.


옵션으로 문자열을 검색하려면 SendMessageA() 함수의 올바른 선언을 확인해야 합니다.

마지막 매개변수는 문자열로 선언해야 합니다. 기본적으로 정수로 남아 있으면 컴파일러는

오류 없이 코드를 삼키지만 기능이 제대로 작동하지 않습니다.

 
Ilnur >> :

코드가 정확하므로 작동해야 합니다. 이 코드는 문제 없이 작동합니다.

오류가 발생하면 함수는 일반적으로 0이 아닌 -1을 반환합니다. 코드에 오류가 있을 수 있습니다.


옵션으로 문자열을 검색하려면 SendMessageA() 함수의 올바른 선언을 확인해야 합니다.

마지막 매개변수는 문자열로 선언해야 합니다. 기본적으로 정수로 남아 있으면 컴파일러는

오류 없이 코드를 삼키지만 기능이 제대로 작동하지 않습니다.

터미널에서 내 코드를 시도하십시오. 내 터미널이나 라이브러리가 있는 Windows가 서투른 것일 수 있습니다.

 

내 전문가 선택 코드는 귀하와 동일합니다.

hExpertBox = GetDlgItem(hTesterWnd, 0x468);
nPosition = SendMessageA(hExpertBox, CB_FINDSTRING, 0, sExpertName);
SendMessageA(hExpertBox, CB_SETCURSEL, nPosition, 0);

여기서 sExpertName은 문자열로 된 전문가의 이름입니다.


실험의 순수성을 위해 귀하의 코드를 실행했습니다. 모든 것이 작동합니다.

 
Ilnur >> :

내 전문가 선택 코드는 귀하와 동일합니다.

여기서 sExpertName은 문자열로 된 전문가의 이름입니다.


실험의 순수성을 위해 귀하의 코드를 실행했습니다. 모든 것이 작동합니다.

뭔가 이상한 ... 그것은 나를 위해 작동하지 않습니다.

Windows 비용과 서비스 팩은 무엇입니까?

 

컴퓨터와 네트워크에서 user32.dll 라이브러리 파일을 살펴보니 다양한 크기의 파일 이 잔뜩 있습니다.

아마도 내 문제는 라이브러리 자체가 곡선이라는 것입니다.


Ilnur, 어렵지 않다면 여기에 라이브러리 버전을 게시해 주시면 테스트해 보겠습니다.

Yuraz, 그리고 당신은 Ilnur의 코드에 따라 함수의 이름을 찾아서 대체했습니다. 어렵지 않다면 라이브러리도 배치하십시오.

 
HIDDEN >> :

컴퓨터와 네트워크에서 user32.dll 라이브러리 파일을 살펴보니 다양한 크기의 파일이 많이 있습니다.

아마도 내 문제는 라이브러리 자체가 곡선이라는 것입니다.


Ilnur, 어렵지 않다면 여기에 라이브러리 버전을 게시해 주시면 테스트해 보겠습니다.

Yuraz, 그리고 당신은 Ilnur의 코드에 따라 함수의 이름을 찾아서 대체했습니다. 어렵지 않다면 라이브러리도 배치하십시오.

SP2 XPPRO

소프트웨어가 지속적으로 컴퓨터에 많이 설치되어 있으면 무엇이든 될 수 있습니다.

AXIS가 대상인 경우 - 안정적이고 입증된 소규모 작업 세트가 회전하는 경우

즉, 많은 프로그램의 가치가 없으며 무언가가 지속적으로 철거되고 많은 것이 거기에 배치되지 않습니다.

일반적으로 문제가 없습니다

파일:
user32.zip  301 kb
사유: