| / | Форум |
|
RickD
26.05.2006 13:08
Попытка закрыть терминал программным способом:
#import "kernel32.dll" void ExitProcess(int ExitCode); #import void init() { ExitProcess(0); }И разрешается импорт dll в эксперте. Результат получается такой. У меня закрывается нормально. У некоторых терминал закрывается, а процесс остается висеть. У некоторых закрывается с ошибкой. В MSDN сказано: Warning Calling ExitProcess in a DLL can lead to unexpected application or system errors. Be sure to call ExitProcess from a DLL only if you know which applications or system components will load the DLL and that it is safe to call ExitProcess in this context. Может быть причина такого поведения ExitProcess кроется в этом? |
|
Бесплатная Groupware для групп разработчиков Установите систему групповой работы TeamWox и объедините усилия всех разработчиков. Это поможет вашей команде работать быстрее и организованнее. Благодаря TeamWox станет намного проще ставить задачи и контролировать их выполнение. |
5198 |
stringo
26.05.2006 14:52
RickD писал (а): В MSDN сказано: Warning Calling ExitProcess in a DLL can lead to unexpected application or system errors. Be sure to call ExitProcess from a DLL only if you know which applications or system components will load the DLL and that it is safe to call ExitProcess in this context. Может быть причина такого поведения ExitProcess кроется в этом? Вряд ли. Вообще, непонятный ворнинг (я его, кстати, не нашёл в своём MSDN). Причём здесь вызов ExitProcess из DLL? Библиотеки по-любому выполняются в адресном пространстве процесса |
|
Mak
29.05.2006 11:36
У меня даже при закрытии терминала руками он часто остается
висеть в TaskManager и его приходится убивать там руками.
Вот и сегодня посмотрел, висит терминал которой я закрывал в четверг, три дня комп был включен, но я к нему не подходил. |
|
alexjou
31.05.2006 00:52
Дэн Эпплман "Win32 API и Visual Basic", SAMS - Питер, 2002. Теме посвящена
глава 14 "Процессы и нити", подраздел "Межпроцессные взаимодействия".
|
|
alexjou
31.05.2006 01:17
Mak писал (а): У меня даже при закрытии терминала руками он часто остается висеть в TaskManager и его приходится убивать там руками. Вот и сегодня посмотрел, висит терминал которой я закрывал в четверг, три дня комп был включен, но я к нему не подходил. Если через меню "Файл" --> "Выход", в принципе могут быть проблемы. Это известный виндовский глюк. Лучше действовать через крестик на форме. |
|
RickD
31.05.2006 23:43
alexjou писал (а): Можно также отправить сообщение через PostThreadMessage.В следующей строке программы это сообщение используется для
закрытия формы: BOOL PostThreadMessage( DWORD idThread, // thread identifier UINT Msg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter );Но как определить хэндл главного окна либо Id главного потока из EA, вот в чем вопрос. |
|
alexjou
01.06.2006 01:20
Это можно сделать оконным субклассингом (для окна) либо повесив
хук на запуск МТ (для процессов). Посмотри в MSDN описания функций
EnumWindows(), EnumWindowsProc(), EnumChildWindows(), SetWindowsHookEx() и CallWndProc(). Здесь в
аттаче примерчик на VB6 c библиотекой и описанием. Правда, сам
детально с ним пока что не разбирался. Посмотри, может пригодится.
|
|
RickD
01.06.2006 14:32
Хуки сразу в топку. :) |
5198 |
stringo
01.06.2006 15:08
RickD писал (а): Хуки сразу в топку. :) Как вариант - поискать в цикле родительское окно. Хэндл окна графика известен. //+------------------------------------------------------------------+ //| CloseTerminal.mq4 | //| Copyright © 2006, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" #property show_inputs #include <WinUser32.mqh> //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { int hwnd=WindowHandle(Symbol(),Period()); int hwnd_parent=0; //---- while(!IsStopped()) { hwnd=GetParent(hwnd); if(hwnd==0) break; hwnd_parent=hwnd; } if(hwnd_parent!=0) PostMessageA(hwnd_parent,WM_CLOSE,0,0); //---- return(0); } //+------------------------------------------------------------------+ |
|
wlad
15.06.2007 09:26
Подскажите, как этим пользоваться
Например при нажатии клавиши пробел, чтобы закрывался терминал при компиляции к тому же выскакивает GetParent - функция не объявлена |
|
Jhonny
15.06.2007 10:14
Но как определить хэндл главного окна FindWindow('MetaQuotes::MetaTrader::4.00',nil) |
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий