Не принимается SendMessageA

 

Хочу передать цифру из одного мт4 в другой через wParam - не принимает, наврено терминал принимат сообщение раньше окна графа и удаляет его.

шлю вот так

SendMessageA (HWND, NULL, 543, 0);

принимаю вот так

#define PM_NOREMOVE 0x0000
#define PM_REMOVE 0x0001
#define PM_NOYIELD 0x0002
#import "user32.dll"

bool PeekMessageA( int& lpMsg[7], int hWnd, int wMsgFilterMin, int wMsgFilterMax, int remflg );
bool GetMessageA(int& lpMsg[7],int a1,int a2,int a3);
int start()
{int A[7];
if(Comment(PeekMessageA(A,0 , 0, 0, PM_NOREMOVE))
  {Alert("123");
   if (GetMessageA(A, 0, 0, 0))
    {Alert("456");
    }
  }
}

Не алертует ни 123 ни 456

 
Expert >>:

Хочу передать цифру из одного мт4 в другой через wParam - не принимает, наврено терминал принимат сообщение раньше окна графа и удаляет его.

шлю вот так

SendMessageA (HWND, NULL, 543, 0);

принимаю вот так

Не алертует ни 123 ни 456

Если я что-нибудь в чем-нибудь еще понимаю, то функция start() и сама вызывается по сообщению прихода нового тика. Вполне возможно, что другие сообщения окон к этому моменту уже отработаны очередью, которая, не поняв идентификатор 543, просто пропустит его мимо ушей.

Чтоб все правильно работало, используйте эмуляцию тика, например, PostMessageA (hwnd, WM_COMMAND, 2, 1). Пошерстите форум, тема замусоленная донельзя.

 

Вот, к примеру, разбирайтесь... https://www.mql5.com/ru/code/8710

 
alsu писал(а) >>

Вот, к примеру, разбирайтесь... https://www.mql5.com/ru/code/8710

форум то я прошерстел, и не один - на этот вопрос ответа не нашел. Задача: передать строку из одного мт в другой через атом. а идентификатор атома передать как wParam sendmessage.

эмуляция тика конечно нужна, но атом тоже передать надо.

 

Че-то не глянул в ваш код внимательно сначала - функция Comment возвращает тип void, зачем ее в if-то?? Поэтому условие и не срабатывает.

А PeekMessageA лучше все-таки не в if(), а в while(), бог его знает, сколько там сообщений в очереди лежит.

 
alsu писал(а) >>

Че-то не глянул в ваш код внимательно сначала - функция Comment возвращает тип void, зачем ее в if-то?? Поэтому условие и не срабатывает.

А PeekMessageA лучше все-таки не в if(), а в while(), бог его знает, сколько там сообщений в очереди лежит.

Извиняюсь за писанину, в первоначальном варианте не было if(coment все равно не принимал. отсылать отсылал - но не принимал. А теперь и не отсылает(

Я вот и спрашиваю какое вообще WM сообщение надо отослать чтоб его ни кто не считал кроме самого советника?

 
Гипотетически нужно бы создать свое собственное окно и передавать сообщение в него, но реализовать это можно только в dll, и все равно останутся проблемы с синхронизацией, потому что, как уже сказал alsu, терминал вызывает start из очереди сообщений и не смотрит на то, есть ли в стеке уже предыдущий вызов start, в котором Вы принимаете другое сообщение. В результате контекст приемного скрипта сбрасывается (в терминале только одна копия переменных). Если уж и писать приемо-передатчик на dll, то в вашем случае вероятно имеет смысл воспользоваться пайпами или сокетами (с чем проще работать исходя из собственного опыта).
 
marketeer писал(а) >>
Гипотетически нужно бы создать свое собственное окно и передавать сообщение в него, но реализовать это можно только в dll, и все равно останутся проблемы с синхронизацией, потому что, как уже сказал alsu, терминал вызывает start из очереди сообщений и не смотрит на то, есть ли в стеке уже предыдущий вызов start, в котором Вы принимаете другое сообщение. В результате контекст приемного скрипта сбрасывается (в терминале только одна копия переменных). Если уж и писать приемо-передатчик на dll, то в вашем случае вероятно имеет смысл воспользоваться пайпами или сокетами (с чем проще работать исходя из собственного опыта).

Окно - то есть форму с Visible=false например? Допустим я создал форму. Что надо вписать вот здесь: SendMessageA (HWND, ??????????, 543, 0); чтобы форма принила это сообщение и чтобы его считал именно мой код и передал дальше в советник.....

Так стоп!

зачем в окно слать сообщение если советнику в любом случае надо так же передать это сообщение? Как совтеник то узнает цифру?

А может через MMF? Есть у кого нибудь примерчик?

 

Если делать капитально, то нужно определить класс окна и функцию обработки сообщений. Так можно было бы реализовать целый протокол с подтверждением получения данных. Если по-простому, то можно создать контрол типа поля ввода или лэбела и посылать ему WM_SETTEXT или вызывать SetWindowText, а затем просто читать содержимое уже из скрипта-приемника (GetWindowText).

Окно - это одно из средств коммуникации в Windows (бай дизайн), советник может оперировать окнами напрямую (до некоторой степени) или "по полной программе", если действовать через dll.

 
marketeer писал(а) >>

Если делать капитально, то нужно определить класс окна и функцию обработки сообщений. Так можно было бы реализовать целый протокол с подтверждением получения данных. Если по-простому, то можно создать контрол типа поля ввода или лэбела и посылать ему WM_SETTEXT или вызывать SetWindowText, а затем просто читать содержимое уже из скрипта-приемника (GetWindowText).

Окно - это одно из средств коммуникации в Windows (бай дизайн), советник может оперировать окнами напрямую (до некоторой степени) или "по полной программе", если действовать через dll.

С SetText пример здоровский по моему. А пример магете маленький?

 
Прям сейчас не смогу - корпоратив ;-).