Как закрыть терминал из скрипта?

Сегодня мы поговорим о одном интересном способе защиты как закрытие терминала из нашей программы.
Для чего это может понадобиться?

  • как часть защиты от нелегального использования, например закрыть терминал, если срок лицензии на советник истек
  • закрыть терминал при форс мажоре, например достигли предельно допустимую просадку и закрыли сделки и терминал

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

Реализовать это проще всего с помощью функций WinAPI 32: GetParent, PostMessage
Импортируем данные функции из библиотеки user32.dll

#import "user32.dll"
   int      GetParent(int hwnd);
   int      PostMessageA(int hWnd,int Msg,int wParam,int lParam);
#import
#define WM_CLOSE                       0x0010

Подробное описание данных функций вы всегда можете получить на сайте http://msdn.microsoft.com как первоисточнике разработчика OC Windows

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

  1. получить hendle терминала
  2. отправить сообщение WM_CLOSE для завершения его работы

 

void terminal.close(int handle){
   int hwnd=terminal.handle();
   //Print(hwnd);
 
   if(hwnd==0 && handle!=0) hwnd=handle;
    if(hwnd>0) PostMessageA(hwnd,WM_CLOSE,0,0);
//----
   return(0);
  }
//+------------------------------------------------------------------+
int terminal.handle(){
   int hwnd=WindowHandle(Symbol(),Period());
   int hwnd_parent=0;
 
   while(hwnd!=0 && !IsStopped()) {
      hwnd=GetParent(hwnd);
 
      if(hwnd==0) break;
      hwnd_parent=hwnd;
   }
 
   return (hwnd_parent);
}

Функция terminal.handle получает идентификатор терминала для этого  мы перебираем окна в поиске родительского окна самого терминала.

Функция terminal.close выполняет основную работу, а именно посылает сообщение WM_CLOSE.
Многие кто знаком с WinAPI спросят, а почему вместо PostMessage не воспользоваться SendMessage ? А дело вот в чем, сообщения отправленные с помощью SendMessage попадают в очередь, а сообщения PostMessage попадают в обход очереди, что значительно ускоряет обработку и терминал без вопросов закроется.

Отправить ответ

Оставьте первый комментарий!

Notify of
wpDiscuz