Вопрос экспертам, всё же как совместить нажатие ЛКМ и кнопки клавиатуры?

 
Ребят как всё же совместить нажатие ЛКМ и кнопки клавиатуры?
Увидел такое в 1-м индикаторе в мт4, хотел бы узнать как такое сотворил автор? 
как уловить одновременное нажатие?
Данный способ не подходит: ТЫК

какие есть еще варианты?
Спасибо
Форум трейдеров - MQL5.community
Форум трейдеров - MQL5.community
  • www.mql5.com
MQL5: форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
 
vebster005:
Ребят как всё же совместить нажатие ЛКМ и кнопки клавиатуры?
Увидел такое в 1-м индикаторе в мт4, хотел бы узнать как такое сотворил автор? 
как уловить одновременное нажатие?
Данный способ не подходит: ТЫК

какие есть еще варианты?
Спасибо
 if(TerminalInfoInteger(TERMINAL_KEYSTATE_CONTROL) < 0)
      if(id == CHARTEVENT_CLICK)
        {
         // что нибудь делаем)
        }

Ctrl+лкм

 
Aleksandr Slavskii #:

Ctrl+лкм

Спасибо всё работает, а можно как то чтобы было лкм + cntr, а не на оборот

 
при таком примере, я нажимаю и удерживаю cntr далее нажимаю лкм у меня показывается и исчезает объект
Хотелось бы чтобы было наоборот, удерживаю лкм и нажимаю cntr далее ...
 
vebster005 #:
при таком примере, я нажимаю и удерживаю cntr далее нажимаю лкм у меня показывается и исчезает объект
Хотелось бы чтобы было наоборот, удерживаю лкм и нажимаю cntr далее ...


   ChartSetInteger(0, CHART_EVENT_MOUSE_MOVE, true);

   if(id == CHARTEVENT_MOUSE_MOVE)
      if(TerminalInfoInteger(TERMINAL_KEYSTATE_CONTROL) < 0)
        {
         Print("Тыц");
        }
 
Aleksandr Slavskii #:


Спасибо за ответ, но не работает!!!

Если зажать лкм и нажать cntr ничего не происходит

Немного не понял зачем тут 

CHART_EVENT_MOUSE_MOVE

код что сверху как я понял работает если двигать мышку и зажать контр, а именно нажатие лкм и нажатие контра можно?

 

Так не бывает вообще нигде.

Можно попробовать так - запоминать имя последнего объекта, который был выделен. 

Потом, все действия с клавиатуры выполнять над этим объектом.   

 
Dmitry Fedoseev #:

Так не бывает вообще нигде.

Можно попробовать так - запоминать имя последнего объекта, который был выделен. 

Потом, все действия с клавиатуры выполнять над этим объектом.   

Дмитрий и вам спасибо за ответ, индикатор в котором я увидел, сейчас открыл его и протестировал, поднести мышку не на объект а в пустое поле на гарфике, жму лкм(зажимаю) и нажимаю Ё (тильда)
далее!!! ЛКМ не отпускаю, 1-й раз нажал Ё произошло 1 действие, 2- раз нажал Ё ( напомню лкм зажата) произошло 2-е действие, и так далее, 
Человек сверху предложил вариант когда нажимаем не ЛКМ + кнопку, а Кнопку + лкм, может всё же можно как то сделать.
Человек в своем индикаторе ведь как то сделал, вопрос как))) Ребят вы больше шарите тут, подскажите как это сделано

 
vebster005 #:

Дмитрий и вам спасибо за ответ, индикатор в котором я увидел, сейчас открыл его и протестировал, поднести мышку не на объект а в пустое поле на гарфике, жму лкм(зажимаю) и нажимаю Ё (тильда)
далее!!! ЛКМ не отпускаю, 1-й раз нажал Ё произошло 1 действие, 2- раз нажал Ё ( напомню лкм зажата) произошло 2-е действие, и так далее, 
Человек сверху предложил вариант когда нажимаем не ЛКМ + кнопку, а Кнопку + лкм, может всё же можно как то сделать.
Человек в своем индикаторе ведь как то сделал, вопрос как))) Ребят вы больше шарите тут, подскажите как это сделано

int OnInit(){

   
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
   
//---
   return(INIT_SUCCEEDED);
  }
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {


   static int wk=false;

   if(id==CHARTEVENT_MOUSE_MOVE){
     if(lparam>=100 && lparam<200 && dparam>=100 && dparam<200){ // квадрат 100 на 100, с отступом 100 от левого верхнего угла  
       if(sparam=="1"){
         wk=true;
       }
       else{
         wk=false;
       }
     }
   }
   
   if(wk && id==CHARTEVENT_KEYDOWN){
      Comment(GetTickCount()," ",lparam," ",dparam," ",sparam);
   }
   
  }
 

А индикатор с открытым кодом?

Если нет -  мож он вот это использует

https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-mouse_event


В программах та метаквоты статусы клавиш мышки используют, только нам их не дают, а в винде и на плюсах оно есть.


На сайте точно выкладывалась работа с api клавы, возможно там и api мыши есть.


ну или как я предлагал с таймером

событие мышки запоминаем в таймер

клик клавы - сверяем с таймером - делаем нужное действие.

Но такой вариант какой-то не айс - обычно наоборот клава-мыш.

mouse_event function (winuser.h) - Win32 apps
mouse_event function (winuser.h) - Win32 apps
  • 2021.10.13
  • jwmsft
  • docs.microsoft.com
The mouse_event function synthesizes mouse motion and button clicks.
 
Хотя нет, все дали, дальше я не докурил доки
//+------------------------------------------------------------------+
//|                                                   MOUSE_MOVE.mq4 |
//|                        Copyright 2022, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
  //--- включение сообщений о перемещении мыши по окну чарта
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,1);
//--- отключаем контекстное меню чарта (по правой кнопке)   
   ChartSetInteger(0,CHART_CONTEXT_MENU,0);     
//--- отключаем перекрестие (по средней кнопке)      
   ChartSetInteger(0,CHART_CROSSHAIR_TOOL,0); 
//--- принудительное обновление свойств графика гарантирует готовность к обработке событий
   ChartRedraw(); 
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
     if(id==CHARTEVENT_MOUSE_MOVE)
      Comment("POINT: ",(int)lparam,",",(int)dparam,"\n",MouseState((uint)sparam)); 
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| MouseState                                                       |
//+------------------------------------------------------------------+
string MouseState(uint state)
  {
   string res;
   res+="\nML: "   +(((state& 1)== 1)?"DN":"UP");   // mouse left
   res+="\nMR: "   +(((state& 2)== 2)?"DN":"UP");   // mouse right 
   res+="\nMM: "   +(((state&16)==16)?"DN":"UP");   // mouse middle
   res+="\nMX: "   +(((state&32)==32)?"DN":"UP");   // mouse first X key
   res+="\nMY: "   +(((state&64)==64)?"DN":"UP");   // mouse second X key
   res+="\nSHIFT: "+(((state& 4)== 4)?"DN":"UP");   // shift key
   res+="\nCTRL: " +(((state& 8)== 8)?"DN":"UP");   // control key
   return(res);
  }
Причина обращения: