Кибор » Кибор - Интегрированная среда разработки ботов » О программе Кибор » Версия 5.87 Создание своих диалоговых окон с помощью WinApi

Страниц (2): [1] 2 »
 

1. Kibor - 21 Марта, 2021 - 10:44:06 - перейти к сообщению
Доработка address. Можно получить указатель на зарегистрированную в коде Кибор функцию.

Добавлен член структуры message функции getmessage
структуры message.hwnd. В нем содержится HWND окна, к которому это сообщение относится.
========================================================

Появилась возможность создавать свои диалоговые окна с использованием WinApi в любом количестве и стиле.
Сообщения полученные этими окнами обрабатываются функцией WindowProc и распределяются по Кибор функциях приема сообщений getmessage - Получение и обработка сообщений в немодальных окнах Кибор
Для того что бы отлавливать сообщения полученные такими окнами, в функции getmessage не надо указывать первым параметром номер диалога. Различные окна, созданные по разному можно комбинировать между собой.
Пример:
CODE:
function getmessage(WM_LBUTTONDOWN)
{
if (message.hwnd==Win)//Если сообщение от окна
{
beep(1000, 100);
}
}

function getmessage(WM_COMMAND)
{
if (message.lparam==b1)//Если кнопка
{
messagebox ("Кнопка");
}
}

Данные функции принимают сообщения от всех созданных так окон. Разделить их можно с помощью сравнения структуры message.hwnd с HWND нужного окна.


Пример создания одного окна и кнопки и отлова сообщений
CODE:
#define WS_MINIMIZEBOX 131072
#define WS_MAXIMIZEBOX 65536
#define WS_VISIBLE 268435456
#define WS_CAPTION 12582912
#define WS_SYSMENU 524288
#define WS_CHILD 1073741824

#define COLOR_APPWORKSPACE 12

#define WM_LBUTTONDOWN 513
#define WM_COMMAND 273
#define WM_CREATE 1
#define WM_LBUTTONDOWN 513

external(INT, "RegisterClass", "RegisterClassA", "User32.dll" );
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
external(INT, "UnregisterClass", "UnregisterClassA", "User32.dll");

////////////////////
int b1;

int WinProc=address("WindowProc");
char Class[8]={'m', 'y', 'c', 'l', 'a', 's', 's', 0};
int PWNDCLASS[10];//Структура WNDCLASS
int CLASS=address(#PWNDCLASS[0]);//Указатель на структуру класа
initialarray(#PWNDCLASS[0], 0);//Обнуляем структуру

writeaddress(WinProc, address(#PWNDCLASS[1]));//Указываем адрес функции WindowProc
writeaddress(COLOR_APPWORKSPACE, address(#PWNDCLASS[7]));//Указываем цвет диалога
writeaddress(address(#Class[0]), address(#PWNDCLASS[9]));//Указываем указатель на название класа

if (RegisterClass(CLASS)==0){messagebox("Не удалось зарегистрировать клас"); goto er;}

int Win=CreateWindow(0, address(#Class[0]), "Основное окно",
WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU,
10, 10, 500, 500, 0, 0, 0, 0);

/////////////////////

loop()sleep(10);

er:;


//Тут можно создавать контролы для окна, поскольку оно одно и мы можем указать родительским окном для контролов message.hwnd
function getmessage(WM_CREATE)
{
b1=CreateWindow(0, "BUTTON", "Кнопка", WS_VISIBLE | WS_CHILD, 10, 10, 200, 30, message.hwnd, 0, 0, 0);
}


function getmessage(WM_LBUTTONDOWN)
{
if (message.hwnd==Win)//Если сообщение от окна
{
beep(1000, 100);
}
}

function getmessage(WM_COMMAND)
{
if (message.lparam==b1)//Если кнопка
{
messagebox ("Кнопка");
}
}

function getmessage(WM_CLOSE)
{
UnregisterClass(address(#Class[0]), 0);
goto global er;
}


Пример создания двух окон и одного дочерного в первом окне и кнопок в одном окне и в одном дочерном окне.
CODE:
#define WS_MINIMIZEBOX 131072
#define WS_MAXIMIZEBOX 65536
#define WS_VISIBLE 268435456
#define WS_CAPTION 12582912
#define WS_SYSMENU 524288
#define WS_CHILD 1073741824

#define COLOR_APPWORKSPACE 12

#define WM_LBUTTONDOWN 513
#define WM_COMMAND 273
#define WM_CREATE 1
#define WM_LBUTTONDOWN 513

external(INT, "RegisterClass", "RegisterClassA", "User32.dll" );
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
external(INT, "UnregisterClass", "UnregisterClassA", "User32.dll");

////////////////////

int WinProc=address("WindowProc");
char Class[8]={'m', 'y', 'c', 'l', 'a', 's', 's', 0};
int PWNDCLASS[10];//Структура WNDCLASS
int CLASS=address(#PWNDCLASS[0]);//Указатель на структуру класа
initialarray(#PWNDCLASS[0], 0);//Обнуляем структуру

writeaddress(WinProc, address(#PWNDCLASS[1]));//Указываем адрес функции WindowProc
writeaddress(COLOR_APPWORKSPACE, address(#PWNDCLASS[7]));//Указываем цвет диалога
writeaddress(address(#Class[0]), address(#PWNDCLASS[9]));//Указываем указатель на название класа

if (RegisterClass(CLASS)==0){messagebox("Не удалось зарегистрировать клас"); goto er;}

int Win=CreateWindow(0, address(#Class[0]), "Первое окно",
WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU,
10, 10, 500, 500, 0, 0, 0, 0);

int Win_D=CreateWindow(0, address(#Class[0]), "Дочерное окно в окне",
WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_CHILD,
10, 50, 300, 200, Win, 0, 0, 0);
//Кнопку создаем посде создания окна и получения на него HWND, а не в сообщение WM_CREATE, так как в том сообщение окно еще не записало в Win = HWND
int b1=CreateWindow(0, "BUTTON", "Кнопка в доч окне", WS_VISIBLE | WS_CHILD, 10, 10, 200, 30, Win_D, 0, 0, 0);

int Win2=CreateWindow(0, address(#Class[0]), "Второе окно",
WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU,
515, 10, 500, 200, 0, 0, 0, 0);
int b2=CreateWindow(0, "BUTTON", "Кнопка", WS_VISIBLE | WS_CHILD, 10, 10, 120, 30, Win2, 0, 0, 0);

/////////////////////

loop()sleep(10);

er:;

/*
//Тут контролы не создаем, так как в переменные Win и Win2 HWND будут записаны только после отработки функций CreateWindow!
function getmessage(WM_CREATE)
{

}
*/

function getmessage(WM_LBUTTONDOWN)
{
if (message.hwnd==Win2)//Если сообщение от второго окна
{
beep(1000, 100);
}
}

function getmessage(WM_COMMAND)
{
if (message.lparam==b1)//Если кнопка в дочерном окне
{
messagebox ("Кнопка в доч окне");
}
if (message.lparam==b2)//Если кнопка во втором окне
{
messagebox ("Кнопка");
}
}

function getmessage(WM_CLOSE)
{
UnregisterClass(address(#Class[0]), 0);
if (message.hwnd==Win)goto global er;
}
2. Zireael - 21 Марта, 2021 - 10:56:39 - перейти к сообщению
Не забываем вызвать отмену регистрации класса окна при закрытии.
CODE:
external(INT, "UnregisterClass", "UnregisterClassA", "User32.dll");

function getmessage(WM_CLOSE)
{
if (message.hwnd==Win)
{
UnregisterClass(address(#Class[0]), 0);
}
}

Добавьте в пример.
3. Kibor - 21 Марта, 2021 - 11:18:45 - перейти к сообщению
Добавил. Хотя в принципе message.hwnd можно не сравнивать тут.
4. Zireael - 21 Марта, 2021 - 11:27:21 - перейти к сообщению
 Цитата:
Добавил. Хотя в принципе message.hwnd можно не сравнивать тут.

Согласен. Всё равно не удалит класс пока он используется в другом окне. Проще так:
CODE:
function getmessage(WM_CLOSE)
{
UnregisterClass(address(#Class[0]), 0);
}

WM_INITDIALOG не приходит в оконную процедуру?
5. Kibor - 22 Марта, 2021 - 09:02:32 - перейти к сообщению
 Zireael пишет:
WM_INITDIALOG не приходит в оконную процедуру?

По ходу нет... Мне не удалось получить это сообщение для окна созданного так в MFC проекте..

Можно после CreateWindow вставить ShowWindow и отловить WM_SHOWWINDOW и что то сделать в нем..

CODE:
#define WS_MINIMIZEBOX 131072
#define WS_MAXIMIZEBOX 65536
#define WS_VISIBLE 268435456
#define WS_CAPTION 12582912
#define WS_SYSMENU 524288
#define WS_CHILD 1073741824

#define COLOR_APPWORKSPACE 12
#define SW_NORMAL 1

#define WM_LBUTTONDOWN 513
#define WM_COMMAND 273
#define WM_CREATE 1
#define WM_LBUTTONDOWN 513
#define WM_INITDIALOG 272
#define WM_CLOSE 16
#define WM_SHOWWINDOW 24
#define WM_PAINT 15

external(INT, "RegisterClass", "RegisterClassA", "User32.dll" );
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
external(INT, "UnregisterClass", "UnregisterClassA", "User32.dll");
external(INT, "ShowWindow", "ShowWindow", "User32.dll");
////////////////////
int b1;

int WinProc=address("WindowProc");
char Class[8]={'m', 'y', 'c', 'l', 'a', 's', 's', 0};
int PWNDCLASS[10];//Структура WNDCLASS
int CLASS=address(#PWNDCLASS[0]);//Указатель на структуру класа
initialarray(#PWNDCLASS[0], 0);//Обнуляем структуру

writeaddress(WinProc, address(#PWNDCLASS[1]));//Указываем адрес функции WindowProc
writeaddress(COLOR_APPWORKSPACE, address(#PWNDCLASS[7]));//Указываем цвет диалога
writeaddress(address(#Class[0]), address(#PWNDCLASS[9]));//Указываем указатель на название класа

if (RegisterClass(CLASS)==0){messagebox("Не удалось зарегистрировать клас"); goto er;}

int Win=CreateWindow(0, address(#Class[0]), "Основное окно",
WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU,
10, 10, 500, 500, 0, 0, 0, 0);

ShowWindow(Win, SW_NORMAL);


/////////////////////

loop()sleep(10);

er:;


function getmessage(WM_SHOWWINDOW)
{
beep(2000, 100);
messagebox (1);
}


function getmessage(WM_CREATE)
{
b1=CreateWindow(0, "BUTTON", "Кнопка", WS_VISIBLE | WS_CHILD, 10, 10, 200, 30, message.hwnd, 0, 0, 0);
}


function getmessage(WM_LBUTTONDOWN)
{
if (message.hwnd==Win)//Если сообщение от окна
{
beep(1000, 100);
}
}

function getmessage(WM_COMMAND)
{
if (message.lparam==b1)//Если кнопка
{
messagebox ("Кнопка");
}
}

function getmessage(WM_CLOSE)
{
UnregisterClass(address(#Class[0]), 0);
goto global er;
}


Хотя ShowWindow можно и не вызывать. Она сама вызывается при создание так такого окна..
6. Kibor - 22 Марта, 2021 - 10:15:07 - перейти к сообщению
Создание трех окон.
В окне "Второе окно" подключено 2 меню.
Меню окна и меню при клике правой кнопкой мыши.


CODE:
#define WS_MINIMIZEBOX 131072
#define WS_MAXIMIZEBOX 65536
#define WS_VISIBLE 268435456
#define WS_CAPTION 12582912
#define WS_SYSMENU 524288
#define WS_CHILD 1073741824

#define COLOR_APPWORKSPACE 12

#define WM_LBUTTONDOWN 513
#define WM_COMMAND 273
#define WM_CREATE 1

external(INT, "RegisterClass", "RegisterClassA", "User32.dll" );
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
external(INT, "UnregisterClass", "UnregisterClassA", "User32.dll");
external(INT, "CreateMenu", "CreateMenu", "User32.dll" );
external(INT, "CreatePopupMenu", "CreatePopupMenu", "User32.dll" );
external(INT, "AppendMenu", "AppendMenuA", "User32.dll" );
external(INT, "SetMenuInfo", "SetMenuInfo", "User32.dll" );
external(INT, "SetMenu", "SetMenu", "User32.dll" );
external(INT, "TrackPopupMenu", "TrackPopupMenu", "User32.dll" );

////////////////////
win w;
//Сожание меню
int MENUINFO[7]={28, 16, 134217728, 0, 0, 0, 0};
int HMENU, HMENU2, HMENU3;

HMENU2=CreatePopupMenu();
AppendMenu(HMENU2, 16, 1, "Новый" );
AppendMenu(HMENU2, 16, 2, "Открыть" );
AppendMenu(HMENU2, 16, 3, "Сохранить" );
AppendMenu(HMENU2, 16, 4, "Сохранить как" );

HMENU3=CreatePopupMenu();
AppendMenu(HMENU3, 16, 5, "Вырезать" );
AppendMenu(HMENU3, 16, 6, "Копировать" );

HMENU=CreateMenu();
AppendMenu(HMENU, 16, HMENU2, "Файл" );
AppendMenu(HMENU, 16, HMENU3, "Правка" );



//Создание всплывающего меню
int vHMENU, vHMENU2, result;

vHMENU=CreatePopupMenu();
AppendMenu(vHMENU, 0, 111, "MessageBox" );
AppendMenu(vHMENU, 0, 222, "Findimage" );

vHMENU2=CreatePopupMenu();
AppendMenu(vHMENU2, 0, 333, "25" );
AppendMenu(vHMENU2, 0, 444, "50" );
AppendMenu(vHMENU2, 0, 555, "75" );
AppendMenu(vHMENU2, 0, 666, "100" );
AppendMenu(vHMENU, 16, vHMENU2, "Прозрачность" );



////////////////////////



int WinProc=address("WindowProc");
char Class[8]={'m', 'y', 'c', 'l', 'a', 's', 's', 0};
int PWNDCLASS[10];//Структура WNDCLASS
int CLASS=address(#PWNDCLASS[0]);//Указатель на структуру класа
initialarray(#PWNDCLASS[0], 0);//Обнуляем структуру

writeaddress(WinProc, address(#PWNDCLASS[1]));//Указываем адрес функции WindowProc
writeaddress(COLOR_APPWORKSPACE, address(#PWNDCLASS[7]));//Указываем цвет диалога
writeaddress(address(#Class[0]), address(#PWNDCLASS[9]));//Указываем указатель на название класа

if (RegisterClass(CLASS)==0){messagebox("Не удалось зарегистрировать клас"); goto er;}

int Win=CreateWindow(0, address(#Class[0]), "Первое окно",
WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU,
10, 10, 500, 500, 0, 0, 0, 0);

int Win_D=CreateWindow(0, address(#Class[0]), "Дочерное окно в окне",
WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_CHILD,
10, 50, 300, 200, Win, 0, 0, 0);
//Кнопку создаем посде создания окна и получения на него HWND, а не в сообщение WM_CREATE, так как в том сообщение окно еще не записало в Win = HWND
int b1=CreateWindow(0, "BUTTON", "Кнопка в доч окне", WS_VISIBLE | WS_CHILD, 10, 10, 200, 30, Win_D, 0, 0, 0);

int Win2=CreateWindow(0, address(#Class[0]), "Второе окно",
WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU,
515, 10, 500, 200, 0, 0, 0, 0);
int b2=CreateWindow(0, "BUTTON", "Кнопка", WS_VISIBLE | WS_CHILD, 10, 10, 120, 30, Win2, 0, 0, 0);

int hwnd=Win2;
SetMenuInfo(HMENU, address(#MENUINFO[0]));
SetMenu(hwnd, HMENU);



/////////////////////

loop()sleep(10);

er:;

/*
//Тут контролы не создаем, так как в переменные Win и Win2 HWND будут записаны только после отработки функций CreateWindow!
function getmessage(WM_CREATE)
{

}
*/

function getmessage(WM_RBUTTONDOWN)//Отлавливаем клик правой кнопки мыши всплывающее меню
{
if (message.hwnd==Win2)//Если сообщение от второго окна
{
w=formatiw(Win2);
setwindowparam(w);
result=TrackPopupMenu(vHMENU, 256, message.x+w.leftclient, message.y+w.topclient, 0, formatwi(w), 0 ); // вывести меню
if(result==111)messagebox("Выбран пункт MessageBox" );
if(result==222)messagebox("Выбран пункт Findimage" );

if(result==333)transparency(25, w);
if(result==444)transparency(50, w);
if(result==555)transparency(75, w);
if(result==666)transparency(100, w);
}
}

function getmessage(WM_MENUCOMMAND)//Отлавливаем клик по пункту меню
{
if (message.lparam==HMENU2)//идентификатор меню "Файл"
{
if (message.wparam==0)messagebox ("Новый");
if (message.wparam==1)messagebox ("Открыть");
if (message.wparam==2)messagebox ("Сохранить");
if (message.wparam==3)messagebox ("Сохранить как");
}

if (message.lparam==HMENU3)//идентификатор меню "Правка"
{
if (message.wparam==0)messagebox ("Вырезать");
if (message.wparam==1)messagebox ("Копировать");
}
}




function getmessage(WM_LBUTTONDOWN)
{
if (message.hwnd==Win2)//Если сообщение от второго окна
{
beep(1000, 100);
}
}

function getmessage(WM_COMMAND)
{
if (message.lparam==b1)//Если кнопка в дочерном окне
{
messagebox ("Кнопка в доч окне");
}
if (message.lparam==b2)//Если кнопка во втором окне
{
messagebox ("Кнопка");
}
}

function getmessage(WM_CLOSE)
{
UnregisterClass(address(#Class[0]), 0);
if (message.hwnd==Win)goto global er;
}
7. Kibor - 23 Марта, 2021 - 03:38:50 - перейти к сообщению
Для того что бы при запуске скрипта в котором создается окно, скрыть с панели задач главное окно Кибор, можно испорльзовать для него функцию ShowWindow
CODE:
ShowWindow(gethwnd(), SW_HIDE);

Тогда на панели будет только одно созданное окно.

ShowWindow надо вставлять в начало скрипта перед циклом бота и после всех messagebox.

CODE:
#define WS_MINIMIZEBOX 131072
#define WS_MAXIMIZEBOX 65536
#define WS_VISIBLE 268435456
#define WS_CAPTION 12582912
#define WS_SYSMENU 524288
#define WS_CHILD 1073741824
#define SW_HIDE 0

#define COLOR_APPWORKSPACE 12

#define WM_LBUTTONDOWN 513
#define WM_COMMAND 273
#define WM_CREATE 1
#define WM_LBUTTONDOWN 513

external(INT, "RegisterClass", "RegisterClassA", "User32.dll" );
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
external(INT, "UnregisterClass", "UnregisterClassA", "User32.dll");
external(INT, "ShowWindow", "ShowWindow", "User32.dll");

////////////////////
int b1;

int WinProc=address("WindowProc");
char Class[8]={'m', 'y', 'c', 'l', 'a', 's', 's', 0};
int PWNDCLASS[10];//Структура WNDCLASS
int CLASS=address(#PWNDCLASS[0]);//Указатель на структуру класа
initialarray(#PWNDCLASS[0], 0);//Обнуляем структуру

writeaddress(WinProc, address(#PWNDCLASS[1]));//Указываем адрес функции WindowProc
writeaddress(COLOR_APPWORKSPACE, address(#PWNDCLASS[7]));//Указываем цвет диалога
writeaddress(address(#Class[0]), address(#PWNDCLASS[9]));//Указываем указатель на название класа

if (RegisterClass(CLASS)==0){messagebox("Не удалось зарегистрировать клас"); goto er;}

int Win=CreateWindow(0, address(#Class[0]), "Основное окно",
WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU,
10, 10, 500, 500, 0, 0, 0, 0);

/////////////////////
ShowWindow(gethwnd(), SW_HIDE);

loop()sleep(10);

er:;


//Тут можно создавать контролы для окна, поскольку оно одно и мы можем указать родительским окном для контролов message.hwnd
function getmessage(WM_CREATE)
{
b1=CreateWindow(0, "BUTTON", "Кнопка", WS_VISIBLE | WS_CHILD, 10, 10, 200, 30, message.hwnd, 0, 0, 0);
}


function getmessage(WM_LBUTTONDOWN)
{
if (message.hwnd==Win)//Если сообщение от окна
{
beep(1000, 100);
}
}

function getmessage(WM_COMMAND)
{
if (message.lparam==b1)//Если кнопка
{
messagebox ("Кнопка");
ShowWindow(gethwnd(), SW_HIDE);
}
}

function getmessage(WM_CLOSE)
{
UnregisterClass(address(#Class[0]), 0);
goto global er;
}

(Добавление)
Для собранного Exe
Exe надо собирать с галкой
1 Запускать скрипт сразу
2 Скрывать после запуска

Однако открытое окно может быть не на переднем плане.

CODE:
#define WS_MINIMIZEBOX 131072
#define WS_MAXIMIZEBOX 65536
#define WS_VISIBLE 268435456
#define WS_CAPTION 12582912
#define WS_SYSMENU 524288
#define WS_CHILD 1073741824
#define SW_HIDE 0
#define SW_NORMAL 1

#define COLOR_APPWORKSPACE 12

#define WM_LBUTTONDOWN 513
#define WM_COMMAND 273
#define WM_CREATE 1
#define WM_LBUTTONDOWN 513

external(INT, "RegisterClass", "RegisterClassA", "User32.dll" );
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
external(INT, "UnregisterClass", "UnregisterClassA", "User32.dll");
external(INT, "ShowWindow", "ShowWindow", "User32.dll");

////////////////////
int b1;

int WinProc=address("WindowProc");
char Class[8]={'m', 'y', 'c', 'l', 'a', 's', 's', 0};
int PWNDCLASS[10];//Структура WNDCLASS
int CLASS=address(#PWNDCLASS[0]);//Указатель на структуру класа
initialarray(#PWNDCLASS[0], 0);//Обнуляем структуру

writeaddress(WinProc, address(#PWNDCLASS[1]));//Указываем адрес функции WindowProc
writeaddress(COLOR_APPWORKSPACE, address(#PWNDCLASS[7]));//Указываем цвет диалога
writeaddress(address(#Class[0]), address(#PWNDCLASS[9]));//Указываем указатель на название класа

if (RegisterClass(CLASS)==0){messagebox("Не удалось зарегистрировать клас"); goto er;}

int Win=CreateWindow(0, address(#Class[0]), "Основное окно",
WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU,
10, 10, 500, 500, 0, 0, 0, 0);

/////////////////////
ShowWindow(gethwnd(), SW_HIDE);
ShowWindow(Win, SW_NORMAL);
activate(formatiw(Win));
loop()sleep(10);

er:;


//Тут можно создавать контролы для окна, поскольку оно одно и мы можем указать родительским окном для контролов message.hwnd
function getmessage(WM_CREATE)
{
b1=CreateWindow(0, "BUTTON", "Кнопка", WS_VISIBLE | WS_CHILD, 10, 10, 200, 30, message.hwnd, 0, 0, 0);
}


function getmessage(WM_LBUTTONDOWN)
{
if (message.hwnd==Win)//Если сообщение от окна
{
beep(1000, 100);
}
}

function getmessage(WM_COMMAND)
{
if (message.lparam==b1)//Если кнопка
{
messagebox ("Кнопка");
ShowWindow(gethwnd(), SW_HIDE);
}
}

function getmessage(WM_CLOSE)
{
UnregisterClass(address(#Class[0]), 0);
//goto global er;//Для Кибор
close();//Для Exe
}
8. Zireael - 23 Марта, 2021 - 03:59:45 - перейти к сообщению
 Цитата:
Однако открытое окно может быть не на переднем плане.

В таймере вытаскивать окно поверх всех.
9. Kibor - 23 Марта, 2021 - 04:05:51 - перейти к сообщению
 Zireael пишет:
В таймере вытаскивать окно поверх всех.


Как вариант..
Exe надо собирать с галкой
1 Запускать скрипт сразу
2 Скрывать после запуска

CODE:
#define WS_MINIMIZEBOX 131072
#define WS_MAXIMIZEBOX 65536
#define WS_VISIBLE 268435456
#define WS_CAPTION 12582912
#define WS_SYSMENU 524288
#define WS_CHILD 1073741824
#define SW_HIDE 0
#define SW_NORMAL 1

#define COLOR_APPWORKSPACE 12

#define WM_LBUTTONDOWN 513
#define WM_COMMAND 273
#define WM_CREATE 1
#define WM_LBUTTONDOWN 513

external(INT, "RegisterClass", "RegisterClassA", "User32.dll" );
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
external(INT, "UnregisterClass", "UnregisterClassA", "User32.dll");
external(INT, "ShowWindow", "ShowWindow", "User32.dll");

////////////////////
int b1;

int WinProc=address("WindowProc");
char Class[8]={'m', 'y', 'c', 'l', 'a', 's', 's', 0};
int PWNDCLASS[10];//Структура WNDCLASS
int CLASS=address(#PWNDCLASS[0]);//Указатель на структуру класа
initialarray(#PWNDCLASS[0], 0);//Обнуляем структуру

writeaddress(WinProc, address(#PWNDCLASS[1]));//Указываем адрес функции WindowProc
writeaddress(COLOR_APPWORKSPACE, address(#PWNDCLASS[7]));//Указываем цвет диалога
writeaddress(address(#Class[0]), address(#PWNDCLASS[9]));//Указываем указатель на название класа

if (RegisterClass(CLASS)==0){messagebox("Не удалось зарегистрировать клас"); goto er;}

int Win=CreateWindow(0, address(#Class[0]), "Основное окно",
WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU,
10, 10, 500, 500, 0, 0, 0, 0);

/////////////////////
ShowWindow(gethwnd(), SW_HIDE);
enabletimer(0);

loop()sleep(10);

er:;


//Тут можно создавать контролы для окна, поскольку оно одно и мы можем указать родительским окном для контролов message.hwnd
function getmessage(WM_CREATE)
{
b1=CreateWindow(0, "BUTTON", "Кнопка", WS_VISIBLE | WS_CHILD, 10, 10, 200, 30, message.hwnd, 0, 0, 0);
}


function getmessage(WM_LBUTTONDOWN)
{
if (message.hwnd==Win)//Если сообщение от окна
{
beep(1000, 100);
}
}

function getmessage(WM_COMMAND)
{
if (message.lparam==b1)//Если кнопка
{
messagebox ("Кнопка");
ShowWindow(gethwnd(), SW_HIDE);
}
}

function getmessage(WM_CLOSE)
{
UnregisterClass(address(#Class[0]), 0);
//goto global er;//Для Кибор
close();//Для Exe
}

CREATE_TIMER(0, 100)//Номер таймера, выполнение таймера через мсек.
{
loop(10)
{
ShowWindow(Win, SW_NORMAL);
activate(formatiw(Win));
}
disabletimer(0);
}
10. Zireael - 05 Апреля, 2021 - 18:18:29 - перейти к сообщению
Создание полупрозрачного окна (Отобразить)

Powered by ExBB FM 1.0 Final