Kibor |
Отправлено: 21 Марта, 2021 - 17:44:06
|
Эксперт
Покинул форум
Сообщений всего: 8218
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Доработка 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;
} |
|
|
Zireael |
Отправлено: 21 Марта, 2021 - 18:27:21
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Добавил. Хотя в принципе message.hwnd можно не сравнивать тут.
Согласен. Всё равно не удалит класс пока он используется в другом окне. Проще так:
CODE:function getmessage(WM_CLOSE)
{
UnregisterClass(address(#Class[0]), 0);
}
WM_INITDIALOG не приходит в оконную процедуру? |
|
|
Kibor |
Отправлено: 22 Марта, 2021 - 16:02:32
|
Эксперт
Покинул форум
Сообщений всего: 8218
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
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 можно и не вызывать. Она сама вызывается при создание так такого окна.. |
|
|
Kibor |
Отправлено: 22 Марта, 2021 - 17:15:07
|
Эксперт
Покинул форум
Сообщений всего: 8218
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Создание трех окон.
В окне "Второе окно" подключено 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;
} |
|
|
Kibor |
Отправлено: 23 Марта, 2021 - 10:38:50
|
Эксперт
Покинул форум
Сообщений всего: 8218
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Для того что бы при запуске скрипта в котором создается окно, скрыть с панели задач главное окно Кибор, можно испорльзовать для него функцию 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
} |
|
|
Kibor |
Отправлено: 23 Марта, 2021 - 11:05:51
|
Эксперт
Покинул форум
Сообщений всего: 8218
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
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);
}
|
|
|
Zireael |
Отправлено: 06 Апреля, 2021 - 02:18:29
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Создание полупрозрачного окна (Отобразить)CODE:#define WS_VISIBLE 0x10000000
#define WS_EX_TOPMOST 0x00000008
#define WS_SIZEBOX 0x00040000
#define IDC_SIZEALL 32646
#define IDC_ARROW 32512
#define WM_CLOSE 0x0010
#define WS_POPUP 0x80000000
#define WS_EX_LAYERED 524288
#define PS_SOLID 0
#define LWA_ALPHA 2
#define HTCAPTION 2
external(INT, "RegisterClass", "RegisterClassA", "User32.dll");
external(INT, "UnregisterClass", "UnregisterClassA", "User32.dll");
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll");
external(INT, "LoadCursor", "LoadCursorA", "User32.dll");
external(INT, "CreateSolidBrush", "CreateSolidBrush", "Gdi32.dll");
external(INT, "GetModuleHandle", "GetModuleHandleA", "Kernel32.dll");
external(INT, "SetLayeredWindowAttributes", "SetLayeredWindowAttributes", "User32.dll");
external(INT, "SetCursor", "SetCursor", "User32.dll");
int fon_color = rgb(255, 0, 255); // цвет фона
int WinProc=address("WindowProc");
char Class[99];
strcpy(#Class[0], "myclass");
int PWNDCLASS[10];//Структура WNDCLASS
int CLASS=address(#PWNDCLASS[0]);//Указатель на название класса
initialarray(#PWNDCLASS[0], 0);//Обнуляем структуру
PWNDCLASS[1] = WinProc;
PWNDCLASS[6] = LoadCursor(0, IDC_ARROW);
PWNDCLASS[7] = CreateSolidBrush(fon_color); // цвет фона диалога
PWNDCLASS[9] = address(#Class[0]); // имя класса окна
int cursor_size_all = LoadCursor(0, IDC_SIZEALL);
if (RegisterClass(CLASS)==0){messagebox("Не удалось зарегистрировать класс"); goto er;}
int Win=CreateWindow(WS_EX_TOPMOST | WS_EX_LAYERED, address(#Class[0]), "", WS_POPUP | WS_VISIBLE | WS_SIZEBOX, 200, 100, 400, 300, 0, 0, 0, 0);
SetLayeredWindowAttributes(Win, 0, 127, LWA_ALPHA); // 127 - уровень прозрачности от 0 до 255
while(getkeystate(90)==0) // пока не нажата клавиша Z
{
textout(0, 0, 0, "Нажать Z чтобы остановить скрипт", 1);
sleep(1);
}
sendmessage(WM_CLOSE, 0, 0, formatiw(Win));
UnregisterClass(address(#Class[0]), 0);
er:;
function getmessage (WM_LBUTTONDOWN)
{
SetCursor(cursor_size_all);
sendmessage(WM_NCLBUTTONDOWN, HTCAPTION, 0, formatiw(Win));
} |
|
|
|