Закрыть окно стейта кодом (вопрос к знатокам WinApi)

 

Здесь 'Автоматическое сохранение стейтмента с нескольких счетов' автор getch приводит полезный код сохраняющий стейт.

Спасибо ему за полезный код.

Но есть нюансы, которые хотелось бы довести:
- стейт окрывается в уже существующем окне эксплорера, т.о. исчезает ранее открытая страница, нужная информация теряется
- хотелось бы закрыть эксплориер со стейтментом, т.к. его анализ проводится др. средствами.

Можно эти нюансы учесть?

 
M1kha1l >>:

- стейт окрывается в уже существующем окне эксплорера, т.о. исчезает ранее открытая страница, нужная информация теряется

Это зависит от того как настроен браузер, используемый по умолчанию. Например, для Internet Explorer 7 достаточно в настройках

указать, чтобы внешние ссылки открывались в новой вкладке, тогда ранее открытые страницы не исчезнут.


M1kha1l >>:

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

Например, так


#import "user32.dll"
  int GetDesktopWindow();
  int GetWindow(int hWnd, int uCmd);
  int GetWindowTextA(int hWnd, string lpString, int nMaxCount);
  int GetWindowTextLengthA(int hWnd);
  int PostMessageA(int hWnd, int Msg, int wParam, int lParam);
#import

#define GW_HWNDNEXT  2
#define GW_CHILD     5

#define WM_CLOSE     0x0010

void start()
{
   StatementClose(AccountNumber(), AccountName());
}

//функция закрывает окно браузера с отчетом о торговой истории счета
void StatementClose(int nAccountNumber, int nAccountName)
{
   int hWnd, nMaxCount;
   string sWindowName = "                                                                                ";
   
   hWnd = GetWindow(GetDesktopWindow(), GW_CHILD);
   
   while(hWnd!=0)
   {
      hWnd = GetWindow(hWnd, GW_HWNDNEXT);
      
      nMaxCount = GetWindowTextLengthA(hWnd);
      GetWindowTextA(hWnd, sWindowName, nMaxCount+1);
      
      if(StringFind(sWindowName, StringConcatenate(nAccountNumber," - ",nAccountName), 0)>=0)
      {
         PostMessageA(hWnd, WM_CLOSE, 0, 0);
         break;
      }
   }
}


Примечание: функцию StatementClose() желательно вызывать с задержкой, чтобы окно браузера успело активизироваться.

 
Ilnur

Ильнур, спс большое за быстрый ответ!

Все работает.

Изв, возьму на себя смелость внести маленькую корректировку

void StatementClose(int nAccountNumber, s tri ng nAccountName) - вторая переменная строчная

Предполагаю, что примерно также можно закрыть опреленный файл Excel

(именно одно окно файла Excel, а не все приложение Excel), только не соображу как :)

Помоги пжл.

Заранее спасибо

 
M1kha1l >>:

Изв, возьму на себя смелость внести маленькую корректировку

void StatementClose(int nAccountNumber, s tri ng nAccountName) - вторая переменная строчная

Да верно.

M1kha1l писал(а) >>

Предполагаю, что примерно также можно закрыть опреленный файл Excel

(именно одно окно файла Excel, а не все приложение Excel), только не соображу как :)

Помоги пжл.

Заранее спасибо

Закрыть один открытый файл Excel можно, например, так


#import "user32.dll"
  int PostMessageA(int hWnd, int Msg, int wParam, int lParam);
  int ShowWindow(int hWnd, int nCmdShow);
  int GetLastActivePopup(int hWndOwner);
  int SetForegroundWindow(int hWnd);
  int GetDlgItem(int hDlg, int nIDDlgItem);
  int FindWindowA(string lpszClass, string lpszWindow);
#import

#define WM_CLOSE     0x0010
#define BM_CLICK     0x00F5

void start()
{
   ExcelWindowClose("MyFile");
}

//функция для закрытия одного окна Excel
void ExcelWindowClose(string sFileName)
{
   int hWnd, hDlg;
   
   hWnd = FindWindowA("XLMAIN", "Microsoft Excel - "+sFileName+".xls"); //ищем окно
   
   if(hWnd>0)
   {
      SetForegroundWindow(hWnd);           //выводим окно на передний план
      ShowWindow(hWnd, 1);                 //показываем его
      PostMessageA(hWnd, WM_CLOSE, 0, 0);  //посылаем окну сообщение на закрытие
      Sleep(100);
      hDlg = GetLastActivePopup(hWnd);     //проверяем наличие окна подтверждения на сохранение
      if(hDlg!=hWnd) PostMessageA(GetDlgItem(hDlg, 6), BM_CLICK, 0, 0); //подтверждаем
   }
}

Данный код не сработает при наличии других открытых окон.


Реализация задачи закрытия конкретного окна Excel, не закрывая всё приложение, намного сложнее.

Требуется изучение иерархии рабочих окон в приложении Excel и способ их взаимодействия.

К тому же нет гарантии, что код будет универсальным для всех версий программы Excel.

 
Я сделал ошибку

кто-нибудь может мне помочь ?


Как я могу получить это значение?

#define HKEY_CURRENT_USER 0x80000001
#define RRF_RT_REG_SZ 0x00000002
#define KEY_READ 0x20019

#import "Advapi32.dll"
   int RegOpenKeyExA (int, string, int, int , int& a[]);
   int RegQueryValueExA(int Key[], string, int, int, string b, int& c);
    
string key="Software\MetaQuotes Software\MetaTrader 4\Settings"; 

int start()
{
  string name = "Language";
  string wert="                            ";
  int hKey[778];

  int lRet = RegOpenKeyExA(HKEY_CURRENT_USER, key, 0, KEY_READ , hKey);


 int d;
 string dwText="              "; 
 int lpcbData;
 RegQueryValueExA(hKey, name, 0,0, dwText, lpcbData);

 Print(dwText);
return(0);
} 
 
FinGeR >>:
Я сделал ошибку

кто-нибудь может мне помочь ?


Как я могу получить это значение?

это некорректно!

string key="Software\MetaQuotes Software\MetaTrader 4\Settings"; 

на машине может стоять не один терминал!

потому сначала надо определить а какой же терминал

 
FinGeR >>:
Я сделал ошибку

кто-нибудь может мне помочь ?


Как я могу получить это значение?

Вот рабочий вариант:

#import "advapi32.dll"
   int RegOpenKeyA(int hKey, string lpSubKey, int& phkResult[]);
   int RegQueryValueExA(int hKey, string lpValueName, int lpReserved, int& lpType[], string lpData, int& lpcbData[]);
   int RegCloseKey(int hKey);
#import

#define HKEY_CURRENT_USER 0x80000001

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
void start()
{
   string lpSubKey = "Software\\MetaQuotes Software\\MetaTrader 4\\Settings";
   string lpValueName = "Language";
   string lpData = "                                                       ";
   
   int hKey[1], lpType[1], lpcbData[1];
   
   if (RegOpenKeyA (HKEY_CURRENT_USER, lpSubKey, hKey) == 0)
   {
      lpcbData[0] = StringLen(lpData);
      
      if (RegQueryValueExA (hKey[0], lpValueName, 0, lpType, lpData, lpcbData) == 0)
      {
         if (lpType[0] == 1 || lpType[0] == 2 || lpType[0] == 7)
            Print(lpData);
      }
      RegCloseKey (hKey[0]);
   }
}
 
Danke

спасибо


:)

Причина обращения: