Automação com interceptação por botão e clique do mouse. - página 11

 
DKeN:
cm=GetDlgItem(hdlg,ID_SYMBOL);
int pos=SendMessageA(cm,CB_GETCOUNT,0,0);//get number in the list
// encontrar o par
string fs=";
for(int l=0;l<pos;l++){
int ll=SendMessageA(cm,CB_GETLBTEXT,l,fs);
Imprimir(ll," ",fs);
}

por favor, informe como obter corretamente uma lista de ferramentas na janela de pedido (F9)?

Eu recebo o número de elementos, mas não consigo obter exatamente as linhas por número, retorna -1.

#define ID_SYMBOL 0x053E // nome do personagem a selecionar

cmhandle ComboBox

Antes de poder receber qualquer texto, você deve primeiro preparar um buffer suficientemente grande para receber o texto. E sua linha de fs não tem comprimento algum. É estranho que seu terminal não caia por causa desta bagunça. É por isso que você precisa inicializar os fs antes com um fio suficientemente longo. Se considerarmos o caso em geral, quando o comprimento das cordas recebidas pode ser qualquer comprimento, devemos primeiro saber este comprimento com a mensagem CB_GETLBTEXTLEN para saber qual é o tamanho do buffer necessário.
 
lasso:

Alexey, obrigado, a função funciona, mas...


Apenas a identificação do fio é necessária, pois tenho dois terminais em uso.

Eu saí com a identificação do cabeçalho, mas ainda gostaria de saber como determinar a identificação do fio de baixo do testador?

A identificação da linha atual pode ser obtida com a função GetCurrentProcessId()
 
Meat:
Antes de receber qualquer texto, você deve primeiro preparar um buffer suficientemente grande para receber o texto........

TEXTO!!!

Ao adaptar sua função às minhas necessidades

int FindWindow(string class, string caption, bool captionexactly=false)

se deparou com o fato de que o buffer de string string textbuf, declarado localmente no nível de função, é inicializado apenas uma vez na primeira chamada,

e depois se comporta como uma variável estática.

string textbuf="Абвгдежзийклмнопрсту";   // В_ЭТОЙ_СТРОКЕ_255_СИМВОЛОВ
Print("textbuf после инициализации =",textbuf);
Você gostaria de comentar sobre esta situação?
 
lasso:

TEXTO!!!

Ao adaptar sua função às minhas necessidades

se deparou com o fato de que o buffer de string string textbuf, declarado localmente no nível de função, é inicializado apenas uma vez na primeira chamada,

e depois se comporta como uma variável estática.

Você poderia comentar sobre esta situação?

Estou entendendo o que quero dizer. Você quer dizer que o buffer armazena o antigo valor buscado na GetText. Lembro-me que também costumava me surpreender. Mas é uma característica da MQL. Em algum lugar no fórum, os desenvolvedores disseram que todas as cordas constantes definidas no nível do compilador são permanentemente armazenadas na memória em um lugar separado e não são perdidas (sobrescritas) ao deixar a função. Seu endereço é inicialmente conhecido e não muda durante a operação do programa. Portanto, ao chamar a função novamente, quando a mesma seqüência constante é acessada, ela é retirada do mesmo endereço. Mas temos ali um texto diferente que foi colocado pela função GetText.
Da mesma forma, você pode simplesmente imprimir ("Abvgdezijklmnostu") e obter um texto diferente :) Portanto, não se trata de variável textbuf, trata-se de uma string constante. Em tempo de compilação, todas as cordas constantes são verificadas e colocadas no banco de dados, e apenas cordas únicas. Se forem detectadas cordas idênticas, apenas uma instância comum de banco de dados é criada para elas. Conseqüentemente, se você estragar esta instância enquanto trabalha, todas as chamadas para tal seqüência de qualquer parte do programa também retornarão um resultado confuso.

Se você não gostar, você pode criar um buffer programático:

string textbuf="";
for (int i=0; i<255; i++)
  textbuf=textbuf+" ";

Então, não haverá tal problema. Não me lembro se não há problema em fazer isso. Você não receberá um erro de acesso à memória, no entanto. Você deveria tentar.

 
Meat:
Dessa forma, tal problema não ocorreria. Mas não me lembro agora se é possível fazê-lo dessa forma. Será que ocorreria um erro de acesso à memória? Experimente.

Assim que li que "255 caracteres não cabem na tela e estragam o visual do fórum", eu o fiz.

Mas esta opção não funcionou, a função API não devolveu nada... Portanto, deixei sua variante.

......

Muito obrigado de qualquer forma, por outra resposta completa.

 
lasso:

Assim que li que "255 caracteres não cabem na tela e estragam o visual do fórum", eu o fiz imediatamente.

Mas esta opção não funcionou, a função API não devolveu nada... Foi por isso que deixei sua variante.

......

Muito obrigado de qualquer forma, por outra resposta completa.


O prazer é meu.

Tanto quanto sei, a razão é que neste caso a referência ao buffer de texto original pertencente à variável não é passada para a função, mas para sua cópia, ou seja, um buffer temporário que é criado antes que a função seja chamada. Portanto, mesmo que a função altere o texto neste buffer, ele não tem efeito, pois o buffer original permanece inalterado. E a referência ao buffer temporário é perdida quando a função sai. Uma vez me esforcei para passar um fio para a DLL por causa disso. Mas existe uma solução. Você precisa passar um elemento de matriz de cordas para a função. Neste caso, nenhum buffer intermediário é criado, e a função recebe uma referência ao buffer original.

string buffer[1]={""};
for (int i=0; i<500; i++)
  buffer[0]=buffer[0]+" ";

GetWindowTextA(h,buffer[0],500);

Isto deve funcionar.

 
void SetSymbol(int hdlg,string symbol,int len){
   int cm=GetDlgItem(hdlg,ID_SYMBOL);
   int pos=SendMessageA(cm,CB_GETCOUNT,0,0);//получим количество в списке
   string fs,ff;
   
   for(int l=0;l<pos;l++){
       //SendMessageA(cm,CB_SETCURSEL,l,0);
       int len_text=SendMessageA(cm,CB_GETLBTEXTLEN,l,0);
       fs=" ";
       for(int m=0;m<len_text+1;m++) fs=StringConcatenate(fs," ");
       int ll=SendMessageA(cm,CB_GETLBTEXT,l,fs);
       Print(len_text," = ",fs); //пусто!!! длину получает.

          
       ff=StringSubstr(fs,0,len);
      // Print(symbol);
       if(ff==symbol) {
            SendMessageA(cm,CB_SETCURSEL,l,0);
            break;
       }
   }
}

Eu posso obter o comprimento normalmente, mas não consigo obter o texto :-(

Favor explicar como inicializar a seqüência de caracteres corretamente e, em geral, é possível implementá-la sem a dll externa ?

é necessário encontrar um símbolo na lista de ferramentas e selecioná-lo.


 
DKeN:

Eu posso obter o comprimento normalmente, mas não consigo obter o texto :-(

Favor explicar como inicializar a seqüência de caracteres corretamente e, em geral, é possível implementá-la sem a dll externa ?

é necessário encontrar um símbolo na lista de ferramentas e selecioná-lo.

Sobre a inicialização da corda, acabei de explicar em uma mensagem anterior ao camarada laço. Você pode usar um elemento de uma matriz de string, ou simplesmente inicializar a variável string com constante de comprimento suficiente. No seu caso, é mais fácil usar uma constante, porque você sabe antecipadamente que o tamanho da corda resultante não excederá 78 bytes:

12 bytes (ticker do instrumento) + 2 bytes (vírgula e espaço) + 64 bytes (nome completo do instrumento) . Este é o comprimento máximo possível de cordas. Bem, você pode arredondar até 80.

Mas se você quiser apenas SELECCIONAR um instrumento específico na lista, não é necessário obter seu nome. Basta usar a mensagem CB_SELESTRING. Ali, como parâmetro de cadeia, basta enviar apenas a parte inicial do nome ("EURUSD") e ele encontrará e selecionará o item apropriado da lista por si só.

 

O consultor de robô API Milhão de dólares do futuro próximo: Ele faz muitos negócios lucrativos no próprio terminal. :) e quando em um ou dois meses um milionário recém-fundado tentar retirar seu lucro do corretor, ele descobrirá que não houve uma única operação... mas o período de reembolso para o assessor terminou... :))))))))

 

Pessoal, por favor, ajudem-me a identificar o cabo dos botões Comprar/Vender na caixa de Pedido. Encontrei o cabo da caixa de encomendas:

int chart_handle = WindowHandle(Symbol(), Period());
int MT_handle = GetAncestor(chart_handle, GA_ROOT); // GA_ROOT 2
PostMessageA(MT_handle, WM_KEYDOWN, VK_F9, 0); // открываем окошко Ордер
Sleep(1000); // Wait. This is important!
int Order_handle = GetLastActivePopup(MT_handle); // хэндл от Ордер-а

Em seguida, eu tento determinar o cabo do botão (por exemplo, Comprar), mas recebo 0 em resposta.

int Buy_handle = GetDlgItem(Order_handle, 0x40C); // 0x40C найдено с помощью WinSpy++

O mais interessante é que eu não consigo encontrar o cabo de nenhum item na caixa deExecução Imediata. Também não consigo encontrar um cabo para a Execução Imediata propriamente dita. Embora WinSpy++ o veja como um elemento separado e mostre o ID 0xFFFFFFFF para ele.

Por favor, não julgue estritamente, eu sou um principiante.

Razão: