Brumo |
Отправлено: 28 Февраля, 2021 - 20:57:44
|
Наблюдатель
Покинул форум
Сообщений всего: 28
Дата рег-ции: Февр. 2020
Репутация: 7
|
Пример управления скриптом Kibor из Telegram, с помощью Telegram API на Python (библиотека "Telethon" )
Обмен данными между Kibor и Python через Shared memory
Требуется:
Необходимо получить api_id и api_hash (Отобразить)
Цитата:
Заходим на сайт телеграма:(для просмотра ссылки Вам необходимо авторизоваться) Вводим телефон и ждем код подтверждения на родном клиенте телеграма.
Заходим в пункт "API". Ищем "Telegram API" и заходим в "Creating an application" (https://my.telegram.org/apps).
Заполняем поля App title и Short name, нажимаем «Create application» и запоминаем две переменные: api_id и api_hash.
Получить Token, cоздав в телеграм бота (через @BotFather) (Отобразить)
Цитата:
Найдите бота @BotFather в Телеграм. Это официальный бот, созданный специально для управления ботами.
Отправьте ему команду:
/newbot
@BotFather спросит вас, как вы назовёте вашего бота. Следующим сообщением отправьте его название, заканчивающееся на «_bot».
Запишите полученный токен от @BotFather — это ключ для работы с Telegram API.
Установленная библиотека Telethon (работает только на пайтоне версии >3.5) (Отобразить)
В config.ini записать полученные api_id и api_hash.
В button.py, в переменную chat, записать свой user_id
Найти через поиск своего бота(начать диалог).
При первом запуске button.py потребуется указать Token бота.
P.s.Использовался Python версии 3.8.6, Telethon 1.19.4
(Добавление)
Kibor (Отобразить)
CODE:
#define FORMAT_MESSAGE_FROM_SYSTEM 4096
#define FORMAT_MESSAGE_IGNORE_INSERTS 512
#define PAGE_READWRITE 4
#define FILE_MAP_READ 4
#define FILE_MAP_WRITE 2
#define FALSE 0
#define NULL 0
#define INVALID_HANDLE_VALUE -1
#define WS_VISIBLE 268435456
#define WS_CHILD 1073741824
#define WS_BORDER 8388608
external(VOID, "RtlMoveMemory", "RtlMoveMemory", "Ntdll.dll" );
external(INT, "FormatMessage", "FormatMessageA", "kernel32.dll");
external(INT, "CreateFileMapping", "CreateFileMappingA", "Kernel32.dll" );
external(INT, "OpenFileMapping", "OpenFileMappingA", "Kernel32.dll" );
external(INT, "MapViewOfFile", "MapViewOfFile", "Kernel32.dll" );
external(INT, "CloseHandle", "CloseHandle", "Kernel32.dll" );
external(INT, "UnmapViewOfFile", "UnmapViewOfFile", "Kernel32.dll" );
external(INT, "GetLastError", "GetLastError", "Kernel32.dll" );
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
external(INT, "SetWindowLong", "SetWindowLongA", "User32.dll" );
external(INT, "SetWindowText", "SetWindowTextA", "User32.dll" );
string mappingname = "EventName";//Имя "отображаемого" объекта.
int hFileMapping;
int lpFileMap;
char message[5];
char flag[5];
flag[0]='0';
flag[1]='0';
flag[2]='0';
flag[3]='0';
flag[4]=0;
int a=0, b=0;
int b0=0, b1=0, be, fl=0;
hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 100, mappingname);
if(hFileMapping==0)
{
error_text("Ошибка CreateFileMapping: ");
goto end;
}
lpFileMap = MapViewOfFile(hFileMapping, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
if(lpFileMap==0)
{
error_text("Ошибка MapViewOfFile: ");
goto end;
}
createdialog(1);
showdialog(1, "Диалог",740, 525, 198, 78, 1, 1);
SetWindowLong(gethwnd(1), -16, WS_VISIBLE);
enabletimer(1);
RtlMoveMemory(lpFileMap, address(#flag[0]), size(#flag[0]));
looptime(45000)
{
if(flag[1]=='1')
{
textout(0, 780, 480, format(a), 1);
a++;
}
if(flag[2]=='1')
{
textout(1, 876, 480, format(b), 1);
b++;
}
sleep(1);
}
function error_text(string er_text)
+HIDE0>{
int error=GetLastError();
char message_2[999];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 0, error, 0, address(#message_2[0]), sizearray(message_2), 0);
messagebox(er_text+format(#message_2[0])+"("+ format(error)+")");
}/HIDE0>
function getmessage(1, WM_CREATE)
+HIDE1>
{
b0=CreateWindow(0, "BUTTON", "T1 старт", WS_CHILD | WS_VISIBLE, -2, -2, 100, 40, gethwnd(1), 0, 0, 0); // создать кнопку
b1=CreateWindow(0, "BUTTON", "T2 старт", WS_CHILD | WS_VISIBLE, 98, -2, 100, 40, gethwnd(1), 0, 0, 0); // создать кнопку
be=CreateWindow(0, "BUTTON", "Exit", WS_CHILD | WS_VISIBLE, -2, 38, 200, 40, gethwnd(1), 0, 0, 0); // создать кнопку
}/HIDE1>
function getmessage(1, WM_COMMAND)
+HIDE2>
{
if(message.lparam==b0)
{
if(flag[1]=='1')
{
flag[1]='0';
SetWindowText(b0, "T1 старт");
}
else
{
flag[1]='1'; //указали что нажата первая кнопка(Т1)
SetWindowText(b0, "T1 пауза");
}
flag[0]='1'; //указали что есть новые данные для Python
RtlMoveMemory(lpFileMap, address(#flag[0]), size(#flag[0])); //"записали в память"
}
if(message.lparam==b1)
{
if(flag[2]=='1')
{
flag[2]='0';
SetWindowText(b1, "T2 старт");
}
else
{
flag[2]='1'; //указали что нажата вторая кнопка(Т2)
SetWindowText(b1, "T2 пауза");
}
flag[0]='1'; //указываем что есть новые данные для Python
RtlMoveMemory(lpFileMap, address(#flag[0]), size(#flag[0])); //"записали в память"
}
if(message.lparam==be)
{
flag[3]='1'; //указали что нажата третья кнопка(Exit)
flag[0]='1'; //указываем что есть новые данные для Python
RtlMoveMemory(lpFileMap, address(#flag[0]), size(#flag[0])); //"записали в память"
disabletimer(1);
pause(100);
goto global end;
}
}/HIDE2>
CREATE_TIMER(1, 1)//
+HIDE3>
{
sleep(10);
RtlMoveMemory(address(#message[0]), lpFileMap, 5);//Считывание с памяти.
if(message[0]=='2') //Если "2" то "поступили" новые данные с Python.
{
message[0]='0'; //Изменили на "0",указали что прочитали данные
RtlMoveMemory(lpFileMap, address(#message[0]), 1);//отправили что прочитано
if(message[1]!=flag[1]) //Проверка состояния первой кнопки
{
if(message[1]=='0')
{
flag[1]='0';
SetWindowText(b0, "T1 старт");
}
else
{
flag[1]='1';
SetWindowText(b0, "T1 пауза");
}
}
if(message[2]!=flag[2]) //Проверка состояния второй кнопки
{
if(message[2]=='0')
{
flag[2]='0';
SetWindowText(b1, "T2 старт");
}
else
{
flag[2]='1';
SetWindowText(b1, "T2 пауза");
}
}
if(message[3]!=flag[3]) //Проверка состояния кнопки Exit
{
if(message[3]=='1') //Если "1" значит была нажата
{
disabletimer(1);
pause(100);
goto global end;
}
}
}
}/HIDE3>
end:
if(UnmapViewOfFile(lpFileMap)!=1)//Отменяет отображение.
{
error_text("Ошибка UnmapViewOfFile: ");
}
if(CloseHandle(hFileMapping)!=1)//Закрывает дескриптор созданного объекта.
{
error_text("Ошибка CloseHandle: ");
}
|
|
|
Brumo |
Отправлено: 03 Марта, 2021 - 19:30:10
|
Наблюдатель
Покинул форум
Сообщений всего: 28
Дата рег-ции: Февр. 2020
Репутация: 7
|
Brumo пишет: через NewMessage, отлавливать новые сообщения
Примерно так:
Kibor (Отобразить)
CODE:
#define FORMAT_MESSAGE_FROM_SYSTEM 4096
#define FORMAT_MESSAGE_IGNORE_INSERTS 512
#define PAGE_READWRITE 4
#define FILE_MAP_READ 4
#define FILE_MAP_WRITE 2
#define FALSE 0
#define NULL 0
#define INVALID_HANDLE_VALUE -1
#define WS_VISIBLE 268435456
#define WS_CHILD 1073741824
#define WS_BORDER 8388608
external(VOID, "RtlMoveMemory", "RtlMoveMemory", "Ntdll.dll" );
external(INT, "FormatMessage", "FormatMessageA", "kernel32.dll");
external(INT, "CreateFileMapping", "CreateFileMappingA", "Kernel32.dll" );
external(INT, "OpenFileMapping", "OpenFileMappingA", "Kernel32.dll" );
external(INT, "MapViewOfFile", "MapViewOfFile", "Kernel32.dll" );
external(INT, "CloseHandle", "CloseHandle", "Kernel32.dll" );
external(INT, "UnmapViewOfFile", "UnmapViewOfFile", "Kernel32.dll" );
external(INT, "GetLastError", "GetLastError", "Kernel32.dll" );
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
external(INT, "SetWindowLong", "SetWindowLongA", "User32.dll" );
external(INT, "SetWindowText", "SetWindowTextA", "User32.dll" );
string mappingname = "EventName";
int hFileMapping;
int lpFileMap;
char message[100];
char flag[5];
flag[0]='0';
flag[1]='0';
flag[2]='0';
flag[3]='0';
flag[4]=0;
int a=0, b=0;
int b0=0, b1=0, be, fl=0;
int x1, x2;
hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 100, mappingname);
if(hFileMapping==0)
{
error_text("Ошибка CreateFileMapping: ");
goto end;
}
lpFileMap = MapViewOfFile(hFileMapping, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
if(lpFileMap==0)
{
error_text("Ошибка MapViewOfFile: ");
goto end;
}
createdialog(1);
showdialog(1, "Диалог",740, 525, 198, 78, 1, 1);
SetWindowLong(gethwnd(1), -16, WS_VISIBLE);
enabletimer(1);
RtlMoveMemory(lpFileMap, address(#flag[0]), size(#flag[0]));
resettextout(1);
looptime(45000)
{
if(flag[1]=='1')
{
textout(0, 780, 480, format(a), 1);
a++;
}
if(flag[2]=='1')
{
textout(1, 876, 480, format(b), 1);
b++;
}
sleep(1);
}
function error_text(string er_text)
+HIDE0>{
int error=GetLastError();
char message_2[999];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 0, error, 0, address(#message_2[0]), sizearray(message_2), 0);
messagebox(er_text+format(#message_2[0])+"("+ format(error)+")");
}/HIDE0>
function getmessage(1, WM_CREATE)
+HIDE1>
{
b0=CreateWindow(0, "BUTTON", "T1 старт", WS_CHILD | WS_VISIBLE, -2, -2, 100, 40, gethwnd(1), 0, 0, 0); // создать кнопку
b1=CreateWindow(0, "BUTTON", "T2 старт", WS_CHILD | WS_VISIBLE, 98, -2, 100, 40, gethwnd(1), 0, 0, 0); // создать кнопку
be=CreateWindow(0, "BUTTON", "Exit", WS_CHILD | WS_VISIBLE, -2, 38, 200, 40, gethwnd(1), 0, 0, 0); // создать кнопку
}/HIDE1>
function getmessage(1, WM_COMMAND)
+HIDE2>
{
if(message.lparam==b0)
{
if(flag[1]=='1')
{
flag[1]='0';
SetWindowText(b0, "T1 старт");
}
else
{
flag[1]='1'; //указали что нажата первая кнопка(Т1)
SetWindowText(b0, "T1 пауза");
}
flag[0]='1'; //указали что есть новые данные для Python
RtlMoveMemory(lpFileMap, address(#flag[0]), size(#flag[0])); //"записали в память"
}
if(message.lparam==b1)
{
if(flag[2]=='1')
{
flag[2]='0';
SetWindowText(b1, "T2 старт");
}
else
{
flag[2]='1'; //указали что нажата вторая кнопка(Т2)
SetWindowText(b1, "T2 пауза");
}
flag[0]='1'; //указываем что есть новые данные для Python
RtlMoveMemory(lpFileMap, address(#flag[0]), size(#flag[0])); //"записали в память"
}
if(message.lparam==be)
{
flag[3]='1'; //указали что нажата третья кнопка(Exit)
flag[0]='1'; //указываем что есть новые данные для Python
RtlMoveMemory(lpFileMap, address(#flag[0]), size(#flag[0])); //"записали в память"
disabletimer(1);
pause(100);
goto global end;
}
}/HIDE2>
CREATE_TIMER(1, 100)//
+HIDE3>
{
RtlMoveMemory(address(#message[0]), lpFileMap, 100);//Считывание с памяти.
if(message[0]=='2') //Если "2" то "поступили" новые данные с Python.
{
message[0]='0'; //Изменили на "0",указали что прочитали данные
RtlMoveMemory(lpFileMap, address(#message[0]), 1);//отправили что прочитано
if(message[1]!=flag[1]) //Проверка состояния первой кнопки
{
if(message[1]=='0')
{
flag[1]='0';
SetWindowText(b0, "T1 старт");
}
else
{
flag[1]='1';
SetWindowText(b0, "T1 пауза");
}
}
if(message[2]!=flag[2]) //Проверка состояния второй кнопки
{
if(message[2]=='0')
{
flag[2]='0';
SetWindowText(b1, "T2 старт");
}
else
{
flag[2]='1';
SetWindowText(b1, "T2 пауза");
}
}
if(message[3]!=flag[3]) //Проверка состояния кнопки Exit
{
if(message[3]=='1') //Если "1" значит была нажата
{
disabletimer(1);
pause(100);
goto end;
}
}
}
if(message[0]=='3') //новое значение переменной x1
{
message[0]='0'; //'0' данные прочитаны
RtlMoveMemory(lpFileMap, address(#message[0]), 1);//отправили что прочитано
x1=formatsn(format(#message[10]));
textout(2, 780, 630, "x1="+format(x1), 1);
}
if(message[0]=='4') //новое значение переменной x2
{
message[0]='0'; //'0' данные прочитаны
RtlMoveMemory(lpFileMap, address(#message[0]), 1);//отправили что прочитано
x2=formatsn(format(#message[20]));
textout(3, 876, 630, "x2="+format(x2), 1);
}
}/HIDE3>
end:
if(UnmapViewOfFile(lpFileMap)!=1)//Отменяет отображение.
{
error_text("Ошибка UnmapViewOfFile: ");
}
if(CloseHandle(hFileMapping)!=1)//Закрывает дескриптор созданного объекта.
{
error_text("Ошибка CloseHandle: ");
}
(Отредактировано автором: 03 Марта, 2021 - 19:32:39) |
|
|
Brumo |
Отправлено: 16 Марта, 2021 - 19:44:39
|
Наблюдатель
Покинул форум
Сообщений всего: 28
Дата рег-ции: Февр. 2020
Репутация: 7
|
Другой способ управления скриптом.
Так как хоть задачи и схожи (управление скриптом через телеграм), но есть принципиальное отличие в методе передачи данных.
В прошлом примере передача осуществлялась через sharedmemory, здесь же происходит запись напрямую в память.
При таком способе кардинально упрощается интеграция в готовый скрипт Kibor, не требуется использование функций WinApi.
Для того чтобы изменять переменную, достаточно добавить одну строку, которая будет записывать в файл данные о переменной:
====================================================
Цитата:
fwrite("x[0]|Переменная x[0]|"+format(address(#x[0]))+"^n" );
Где:
x[0] - имя переменной
Переменная x[0] - имя создаваемой кнопки
format(address(#x[0])) - указатель на переменную
^n - новая строка, можно и так:
fwrite("x[0]|Переменная x[0]|"+format(address(#x[0])));
fwrite(ENDL);
Разделитель "|" обязателен.
И соответственно fopen() и fclose():
Цитата: fopen("C:\telegram\var_list.txt", "w" );//создаст по указанному пути список переменных, вместо var_list можно другое имя
fwrite("x[0]|Переменная x[0]|"+format(address(#x[0]))+"^n" );
fclose();
Добавлять в начале скрипта, после инициализации переменных.
====================================================
Другое немаловажное отличие, не требуется внесение изменений в сам скрипт Python.
Все кнопки в Telegram создаются автоматически, минимально необходимые настройки происходят в файле config.ini:
Цитата: [Telegram]
;указать api_id
api_id = 1234567
;указать api_hash
api_hash = 1234567890abcdef1234567890abcdef
;имя кэша сессии
username = Qwerty
;указать user_id где создавать кнопки
chat = 1234567890
;указать имя процесса
process = kibor.exe
;количество кнопок в ряду
row_width = 2
;путь к файлу полный: C:\telegram\var_list.txt либо относительный: var_list.txt
pvar_list = var_list.txt
Как получить api_id, api_hash и user_id указано в начале темы.
====================================================
Порядок запуска:
Запустить скрипт Кибор, создастся файл с данными.
Запустить write_pm.py от имени администратора, считает данные с файла, создаст кнопки в Telegram.
После нажатия определенной кнопки, в поле ввода вставляется текст такого вида: @Имя_вашего_бота x[0]=
после знака "=" ввести новое значение переменной, нажать отправить.
..от "@Имя_вашего_бота" избавиться нельзя, по крайней мере в нынешней версии Telegram Api..
Можно вводить вручную, и без "@Имя_вашего_бота":
x[0]=111
..если случайно вместе с числом, ввести посторонние символы, к примеру так:
x[0]= h 111
Python удалит лишние пробелы, буквы, оставит только 111
Для закрытия write_pm.py нажать кнопку 'Close', либо в консоли 'Ctrl+C'
P.s. На данный момент изменять можно только int, подумываю добавить позднее char.
string под вопросом, возникли некоторые нюансы.
====================================================
Ссылка на write_pm.py и config.ini
====================================================
Пример скрипта Кибор:
CODE:int flag_1=1;
int flag_2=0;
int timer=12;
int x[2], y[2];
x[0]=100;
y[0]=100;
x[1]=200;
y[1]=200;
fopen ("C:\telegram\var_list.txt", "w");
fwrite("flag_1|Флаг 1|"+format(address(#flag_1))+'^n');
fwrite("flag_2|Флаг 2|"+format(address(#flag_2))+'^n');
fwrite("timer|Таймер|"+format(address(#timer))+'^n');
fwrite("x[0]|координата x[0]|"+format(address(#x[0]))+'^n');
fwrite("y[0]|координата y[0]|"+format(address(#y[0]))+'^n');
fwrite("x[1]|координата x[1]|"+format(address(#x[1]))+'^n');
fwrite("y[1]|координата y[1]|"+format(address(#y[1])));
fclose();
loop(600)
{
textout(0, 760, 320, 'Флаг 1 = '+format(flag_1), 1);
textout(1, 760, 340, 'Флаг 2 = '+format(flag_2), 1);
textout(2, 760, 360, 'Таймер = '+format(timer), 1);
textout(3, 760, 380, 'координата x[0] = '+format(x[0]), 1);
textout(4, 760, 400, 'координата y[0] = '+format(y[0]), 1);
textout(5, 760, 420, 'координата x[1] = '+format(x[1]), 1);
textout(6, 760, 440, 'координата y[1] = '+format(y[1]), 1);
pause(100);
}
Так будут выглядеть кнопки в Telegram:
|
|
|
Brumo |
Отправлено: 21 Марта, 2021 - 17:54:12
|
Наблюдатель
Покинул форум
Сообщений всего: 28
Дата рег-ции: Февр. 2020
Репутация: 7
|
Версия 2.0
Добавлено:
int:
//Записывает int (4 байта)
char:
//Записывает char (1 байт)
char[]:
//Записывает массив char ("длина" + 1 байт(0))
double:
//Записывает double (8 байт)
screen:
//Получение скриншота
button:
//Клик кнопки в диалоговом окне
====================================================
Цитата: fwrite("int:x[0]|Переменная x[0]|"+format(address(#x[0]))+'^n' );
Параметры:
int:x[0] - тип(int: ) и имя переменной(x[0])
Переменная x[0] - имя создаваемой кнопки
format(address(#x[0]) - указатель на переменную
С остальными типами аналогично:
Цитата: fwrite("char:c|Переменная c|"+format(address(#c))+'^n' );
fwrite("char[]:ch[0]|Переменная ch[0]|"+format(address(#ch[0]))+'^n' );
fwrite("double:d|Переменная d|"+format(address(#d))+'^n' );
====================================================
Цитата: fwrite("screen:0|Скриншот|0, 0, 1680, 1050|C:\Telegram\PrintScr\"+'^n' );
Параметры:
screen:0 - тип(screen: ) и номер кнопки(0)
Скриншот - имя создаваемой кнопки
0, 0, 1680, 1050 - старт_X, старт_Y, финиш_X, финиш_Y, сохранит указанную зону
C:\Telegram\PrintScr\ - путь к сохраненному файлу
При нажатии, сделает скрин экрана и сохранит по указанному пути(с указанием даты и времени в имени, формат png), отправит в чат телеграм
====================================================
Цитата: fwrite("button:0|Старт|"+format(b0)+'^n' );
Параметры:
button:0 - тип(button: ) и номер кнопки(0)
Старт - имя создаваемой кнопки
format(b0) - дескриптор окна(button)
Клик кнопки в диалоговом окне.
Если второй параметр не указывать(имя кнопки):
Цитата: fwrite("button:0||"+format(b0)+'^n' );
python перед созданием получит текст окна(button) по указанному дескриптору(через функцию GetWindowText),
если после нажатия текст изменился, то поменяется и имя кнопки в телеграм.
Дескриптор возвращает функция CreateWindow, пример:
b0=CreateWindow(0, "BUTTON", "Старт", WS_CHILD | WS_VISIBLE, 0, 0, 100, 40, gethwnd(1), 0, 0, 0);
добавлять после createdialog();
====================================================
Ссылка(google)
Ссылка(yandex)
====================================================
Пример скрипта Кибор(button):
CODE:#define WS_VISIBLE 268435456
#define WS_CHILD 1073741824
#define WS_BORDER 8388608
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
external(INT, "SetWindowLong", "SetWindowLongA", "User32.dll" );
external(INT, "SetWindowText", "SetWindowTextA", "User32.dll" );
int flag1=0, flag2=0;
int a=0, b=0;
int b0=0, b1=0, be;
createdialog(1);
fopen("C:\Telegram\var_list.txt", "w");
fwrite("button:1||"+format(b0)+'^n');
fwrite("button:2||"+format(b1)+'^n');
fwrite("button:3||"+format(be)+'^n');
fclose();
showdialog(1, "Диалог",740, 525, 198, 78, 1, 1);
SetWindowLong(gethwnd(1), -16, WS_VISIBLE);
enabletimer(1);
loop(60000)
+HIDE0>{
if(flag1==1)
{
textout(0, 780, 480, format(a), 0);
a++;
}
if(flag2==1)
{
textout(1, 876, 480, format(b), 0);
b++;
}
pause(10);
}/HIDE0>
function getmessage(1, WM_CREATE)
+HIDE1>
{
b0=CreateWindow(0, "BUTTON", "T1 старт", WS_CHILD | WS_VISIBLE, -2, -2, 100, 40, gethwnd(1), 0, 0, 0); // создать кнопку
b1=CreateWindow(0, "BUTTON", "T2 старт", WS_CHILD | WS_VISIBLE, 98, -2, 100, 40, gethwnd(1), 0, 0, 0); // создать кнопку
be=CreateWindow(0, "BUTTON", "Exit", WS_CHILD | WS_VISIBLE, -2, 38, 200, 40, gethwnd(1), 0, 0, 0); // создать кнопку
}/HIDE1>
function getmessage(1, WM_COMMAND)
+HIDE2>
{
if(message.lparam==b0)
{
if(flag1==1)
{
flag1=0;
SetWindowText(b0, "T1 старт");
}
else
{
flag1=1;
SetWindowText(b0, "T1 пауза");
}
}
if(message.lparam==b1)
{
if(flag2==1)
{
flag2=0;
SetWindowText(b1, "T2 старт");
}
else
{
flag2=1;
SetWindowText(b1, "T2 пауза");
}
}
if(message.lparam==be)
{
goto global end;
}
}/HIDE2>
CREATE_TIMER(1, 1)
+HIDE3>
{
while(flag1==0&&flag2==0){sleep(1);}
}/HIDE3>
end:
destroydialog(1);
|
|
|
|