Ця замітка не відноситься до академічних матеріалів "що і як треба робити", а швидше до "Tips&Tricks" за власним досвідом. Просто наведу кілька прикладів (вирізки коду, що відноситься безпосередньо до застосування WinAPI) .
1. Імітіція натискань клавіш ("вмикач радників").
Code:
#include <WinUser32.mqh>
...
if (IsExpertEnabled())
Comment("Радники включені");
else {
Comment("Вмикаємо радники");
keybd_event(17, 0, 0, 0); // натискання CTRL
keybd_event(69, 0, 0, 0); // натискання E
Sleep(10); // час на реакцію, бо наступні події можуть загубитись
keybd_event(69, 0, 2, 0); // відпускання E
keybd_event(17, 0, 2, 0); // відпускання CTRL
}
2. Отримання інформації про час модифікації файлу та іншої.
Code:
struct FileTime {
uint LowDateTime;
uint HighDateTime;
};
struct FindFileData {
uint FileAtributes;
FileTime CreationTime;
FileTime LastAccessTime;
FileTime LastWriteTime;
uint FileSizeHigh;
uint FileSizeLow;
uint Reserved1;
uint Reserved2;
char FileName[520];
char AlternateFileName[28];
};
struct SystemTime {
ushort wYear;
ushort wMonth;
ushort wDayOfWeek;
ushort wDay;
ushort wHour;
ushort wMinute;
ushort wSecond;
ushort wMilliseconds;
};
#import "kernel32.dll"
int FindFirstFileW(string path, FindFileData &data);
bool FileTimeToSystemTime(FileTime &time, SystemTime &data);
#import
...
datetime GetMTime(string FileName) {
FindFileData result;
SystemTime filedatetime;
StringReplace(FileName, "/", "\\"); // Провсяк випадок змінюєм звичайні слеші (unix/linux style) на обернені (dos/windows style)
int handle = FindFirstFileW(FileName, result); // Знаходим перший файл, отриманий хендл може використовуватись для подальшої роботи
// з функцією FindNextFileW(), призначеної для обробки кількох файлів з одного каталогу
if (handle == -1) return(-1);
FileTimeToSystemTime(result.LastWriteTime, filedatetime); // У одному з полів структури FindFileData ми отримали необхідну нам
// інформацію, однак у досить дивному вигляді, який потребує подвійного перетворення, спочатку у формат структури SystemTime
// і останнім кроком у формат datetime відомий також як Timestamp, не забувши також відняти різницю часових поясів у секундах,
// для повернення до GMT - з ним легше оперувати
return StringToTime(IntegerToString(filedatetime.wYear)+"."+IntegerToString(filedatetime.wMonth)+"."+IntegerToString(filedatetime.wDay) +
" "+IntegerToString(filedatetime.wHour)+":"+IntegerToString(filedatetime.wMinute)+":"+IntegerToString(filedatetime.wSecond)) -
TimeGMTOffset();
}
3. Копіювання файлів (подолання обмежень "пісочниці" MQL/Files).
Code:
#import "kernel32.dll"
bool CopyFileW(string path1, string path2, bool exist);
#import
...
if (!CopyFileW(From, To, false)) { // Тут в принципі все сказано, лише останній параметр треба пояснити,
// значення true забороняє перезаписувати існуючі файли
Print("Error Copy File: ", From, " > ", To);
}
4. Виконання іншої програми.
Code:
#import "shell32.dll"
int ShellExecuteW(int hwnd, string operation, string file, string parameters, string directory, int show);
#import
...
ShellExecuteW(0, "open", "notepad.exe", NULL, NULL, 1);
Якось так, і будьте обережні з об’явленням структур для параметрів віндових функцій, невірне вирівнювання даних може призвести до досить дивних і важковловимих помилок виконання. Вдалого програмування!