Эмуляция кнопок ALT+R

 

Эмуляция нажатия какой-нибудь одной кнопки клавиатуры получается без проблем. Ниже рабочий скрипт эмуляции нажатия на кнопку F3.

#import "user32.dll"
   int      PostMessageA(int hWnd,int Msg,int wParam,int lParam);
   int      GetAncestor(int hWnd,int gaFlags); 
#import

#define     WM_KEYDOWN              0x0100                                          // клавиша на клавиатуре нажата
#define     WM_KEYUP                0x0101                                          // клавиша на клавиатуре отпущена
#define     VK_F3                   0x72                                            // клавиша F3

int hWmc = (int)ChartGetInteger(0,CHART_WINDOW_HANDLE);                                 // handle текущего окна
int hWmt = GetAncestor(hWmc,2);                                                         // handle платформы MT4/MT5

PostMessageA(hWmt,WM_KEYDOWN,VK_F3,0);
PostMessageA(hWmt,WM_KEYUP,VK_F3,0);

Мне нужно эмулировать нажатие двух кнопок ALT+R (в ручном режиме использование этих горячих клавиш приводит к каскадному выравниванию подокон в главном окне). Для этого я использую код:

#import "user32.dll"
   int      PostMessageA(int hWnd,int Msg,int wParam,int lParam);
   int      GetAncestor(int hWnd,int gaFlags); 
#import

#define     WM_KEYDOWN              0x0100                                          // клавиша на клавиатуре нажата
#define     WM_KEYUP                0x0101                                          // клавиша на клавиатуре отпущена
#define     VK_MENU                 0x12                                            // клавиша ALT
#define     VK_R                    0x52                                            // клавиша R

int hWmc = (int)ChartGetInteger(0,CHART_WINDOW_HANDLE);                                 // handle текущего окна
int hWmt = GetAncestor(hWmc,2);                                                         // handle платформы MT4/MT5

PostMessageA(hWmt,WM_KEYDOWN,VK_MENU,0);
PostMessageA(hWmt,WM_KEYDOWN,VK_R,0);
PostMessageA(hWmt,WM_KEYUP,VK_MENU,0);
PostMessageA(hWmt,WM_KEYUP,VK_R,0);

Этот код не работает. Где ошибка? Может быть существует специальная функция для каскадного выравнивания окон?

Спасибо за помощь.

 
foxmag:

Эмуляция нажатия какой-нибудь одной кнопки клавиатуры получается без проблем. Ниже рабочий скрипт эмуляции нажатия на кнопку F3.

Мне нужно эмулировать нажатие двух кнопок ALT+R (в ручном режиме использование этих горячих клавиш приводит к каскадному выравниванию подокон в главном окне). Для этого я использую код:

Этот код не работает. Где ошибка? Может быть существует специальная функция для каскадного выравнивания окон?

Спасибо за помощь.

Почему не срабатывает программное нажатие на две клавиши?

 
foxmag:

Эмуляция нажатия какой-нибудь одной кнопки клавиатуры получается без проблем. Ниже рабочий скрипт эмуляции нажатия на кнопку F3.

Мне нужно эмулировать нажатие двух кнопок ALT+R (в ручном режиме использование этих горячих клавиш приводит к каскадному выравниванию подокон в главном окне). Для этого я использую код:

Этот код не работает. Где ошибка? Может быть существует специальная функция для каскадного выравнивания окон?

Спасибо за помощь.

https://www.mql5.com/ru/forum/450216#comment_48017754

Не оно?

Упорядочить окна графиков вертикально программно.
Упорядочить окна графиков вертикально программно.
  • 2023.07.05
  • www.mql5.com
Здравствуйте. Имеется необходимость программно упорядочивать расположение окон в мт5...
 
Aleksandr Slavskii #:

https://www.mql5.com/ru/forum/450216#comment_48017754

Не оно?

Спасибо. Код с Вашей поправкой по данной ссылке действительно работает в МТ5, но отказывается работать в МТ4. В МТ4 не происходит ничего. Как быть?

 
foxmag #:

Спасибо. Код с Вашей поправкой по данной ссылке действительно работает в МТ5, но отказывается работать в МТ4. В МТ4 не происходит ничего. Как быть?

Я не работаю с мт4

попробуйте найти значения с помощью  spy++  

Ну и вместо SendMessageW используйте SendMessageA

 
Update к моему предыдущему сообщению. Провёл новый тест для всех четырёх случаев расположения окон для МТ4 и МТ5. В МТ4 3-й параметр в SendMessageW для мозаики 33527 не работает, а в МТ5 с ним всё в порядке. Остальные 3 случая, а именно каскад 57650 | вертикально 57652 | горизонтально 57651 работают и в МТ4, и в МТ5. По-видимому, значение для мозаики 33527 ошибочно. Странно, что это значение в МТ5 срабатывает. Есть решение беды?
 
С  SendMessageA всё работает (кроме мозаики, как я выше писал) и на МТ4, и на МТ5, проверил. spy++ у меня есть, но я не знаю, как найти значение. Может быть, пару слов на эту тему... Кстати, я в первом посте ошибся, мне нужен не каскад, а мозаика, если принять интерпретацию расположения окон по Вашей модели (той, что по Вашей ссылке).
 
foxmag #:
С  SendMessageA всё работает (кроме мозаики, как я выше писал) и на МТ4, и на МТ5, проверил. spy++ у меня есть, но я не знаю, как найти значение. Может быть, пару слов на эту тему... Кстати, я в первом посте ошибся, мне нужен не каскад, а мозаика, если принять интерпретацию расположения окон по Вашей модели (той, что по Вашей ссылке).

Ну из меня помощник, так себе. Сам всё делаю методом научного тыка.

Я хз что там в четвёрке, тем более, что она 32 битная, а у меня  spy++ только для 64 битных приложений.

Всё чем мог...

 
Aleksandr Slavskii #:

Ну из меня помощник, так себе. Сам всё делаю методом научного тыка.

Я хз что там в четвёрке, тем более, что она 32 битная, а у меня  spy++ только для 64 битных приложений.

Всё чем мог...

Вы могли бы рассказать, как с помощью spy++ находить значение 3-го параметра SendMessageW. Помогите, пожалуйста.

 
foxmag:

Эмуляция нажатия какой-нибудь одной кнопки клавиатуры получается без проблем. Ниже рабочий скрипт эмуляции нажатия на кнопку F3.

Мне нужно эмулировать нажатие двух кнопок ALT+R (в ручном режиме использование этих горячих клавиш приводит к каскадному выравниванию подокон в главном окне). Для этого я использую код:

Этот код не работает. Где ошибка? Может быть существует специальная функция для каскадного выравнивания окон?

Спасибо за помощь.

Держите:

#define _WIN64  // Only for a 64-bit terminal!

#include <WinDef.mqh>

#define     VK_MENU     0x12   // клавиша ALT
#define     VK_R        0x52   // клавиша R

#define INPUT_MOUSE     0
#define INPUT_KEYBOARD  1
#define INPUT_HARDWARE  2

#define KEYEVENTF_KEYUP 0x0002

struct MOUSEINPUT pack( sizeof( PVOID ) )
{
   LONG   dx;
   LONG   dy;
   DWORD   mouseData;
   DWORD   dwFlags;
   DWORD   time;
   ULONG_PTR dwExtraInfo;
};

struct KEYBDINPUT pack( sizeof( PVOID ) )
{
   WORD    wVk;
   WORD    wScan;
   DWORD   dwFlags;
   DWORD   time;
   ULONG_PTR dwExtraInfo;
};

struct HARDWAREINPUT
{
   DWORD   uMsg;
   WORD    wParamL;
   WORD    wParamH;
};

struct INPUT pack( sizeof( PVOID ) )
{
   DWORD type;
   
#ifdef _WIN64
   uint pad;
#endif
   
   union __inputs
   {
      MOUSEINPUT     mi;
      KEYBDINPUT     ki;
      HARDWAREINPUT  hi;
   } inp;
};


#import "user32.dll"
   UINT SendInput( UINT nInputs, INPUT& pInputs[], int cbSize );
#import

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   INPUT inputs[4];
   
   inputs[0].type = INPUT_KEYBOARD;
   inputs[0].inp.ki.wVk = VK_MENU;
   inputs[0].inp.ki.wScan = 0;
   inputs[0].inp.ki.dwFlags = 0;
   inputs[0].inp.ki.time = 0;
   inputs[0].inp.ki.dwExtraInfo = 0;
   
   inputs[1].type = INPUT_KEYBOARD;
   inputs[1].inp.ki.wVk = VK_R;
   inputs[1].inp.ki.wScan = 0;
   inputs[1].inp.ki.dwFlags = 0;
   inputs[1].inp.ki.time = 0;
   inputs[1].inp.ki.dwExtraInfo = 0;
   
   inputs[2].type = INPUT_KEYBOARD;
   inputs[2].inp.ki.wVk = VK_R;
   inputs[2].inp.ki.wScan = 0;
   inputs[2].inp.ki.dwFlags = KEYEVENTF_KEYUP;
   inputs[2].inp.ki.time = 0;
   inputs[2].inp.ki.dwExtraInfo = 0;
   
   inputs[3].type = INPUT_KEYBOARD;
   inputs[3].inp.ki.wVk = VK_MENU;
   inputs[3].inp.ki.wScan = 0;
   inputs[3].inp.ki.dwFlags = KEYEVENTF_KEYUP;
   inputs[3].inp.ki.time = 0;
   inputs[3].inp.ki.dwExtraInfo = 0;
   
   SendInput( 4, inputs, sizeof( INPUT ) );
}
//+------------------------------------------------------------------+
Файлы:
WinDef.mqh  2 kb
 
Koldun Zloy #:

Держите:

SysListView32 с OWNERDATA есть в наличии?