Автоматизация и боты

 Помощь      Поиск      Пользователи
Сайт Кибор     Программируемый кликер Кибор     Видео обучение     Заказать бот

 Страниц (16): [1] 2 3 4 5 6 7 8 9 » В конец    

> Описание: Создание меню и отлов клика по нему, отлов всех сообщений GetMessage полученных окном.
Kibor
Отправлено: 31 Января, 2019 - 06:42:49
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8091
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




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

Еще создание окон. Рекомендуется создавать так:
Создание любых своих диалоговых окно с помощью WinApi - Любые диалоговые окна на WinApi

Добавлена функция getmessage
Функции созданные с помощью данного оператора отлавливают все сообщения полученный немодальными диалоговыми окнами Кибор.
Такие как WM_MOUSEMOVE, WM_MENUCOMMAND, WM_LBUTTONDOWN, WM_PAINT, WM_SIZE, WM_COMMAND и остальные другие.
Это позволяет полноценно взаимодействовать с окном и создавать свои контролы, которых нет в окнах созданных с помощью функций Кибор.

Синтаксис:
 Цитата:
function getmessage(0, WM_LBUTTONDOWN)//Отлавливаем клик левой кнопки мыши
{
beep(2500, 100);
}


Функции getmessage вызывать не надо. Они сами вызываются при получение окном какого то сообщения. В данном случае эта функция сама вызовется если будет произведен клик левой кн мыши в немодальном диалоге Кибор. Для указания диалога в котором отлавливать сообщения и какое сообщение ловить в скобках указываем 2 параметра.
Первый - номер диалога созданного с помощью Немодальные диалоговые окна
Второй - константа или числовое значение кокой нибудь константы, соответствующие типу сообщения на которое надо выполнять код в этой функции.

При получение какого нибудь сообщения становится доступна структура:
 Цитата:
message.x - координата мыши X
message.y - координата мыши Y
message.wparam - определяет дополнительную информацию о сообщении. Точное значение зависит от значения члена структуры message
message.lparam - определяет дополнительную информацию о сообщении. Точное значение зависит от значения члена структуры message


Более подробную информацию ищите в интернете по запросам примерно такого плана:
 Цитата:
Как отловить клик мыши winapi


Добавил функцию gethwnd
Возвращает HWND созданного диалогового окна с помощью createdialog, для использования в WinApi.
Преимущества получение HWND таким образом в том, что он получается в момент вызова сообщения WM_CREATE.
В обработчике этого сообщения надо создавать все нужные контролы.


Ниже приведен пример как с помощью данных функций определяется выбранный пункт меню созданный в немодальном диалоге Кибор, ловятся сообщения перемещения мыши над диалогом, клик левой кнопки мыши и обновление окна. Так же создаются 2 кнопки и всплывающее меню.

CODE:
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, "CreateWindow", "CreateWindowExA", "User32.dll" );
external(INT, "TrackPopupMenu", "TrackPopupMenu", "User32.dll" );


//Сожание меню
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 b1, b2;


createdialog(0);
showdialog(0, "Диалог",100, 100, 300, 300, 1, 1);

while(window ("Диалог")==0)sleep(10);
win w=window ("Диалог");


loop()
{
w=window ("Диалог");
textout(1, w.left, w.top, " Не обновляли ", 0);
sleep(1);
}

function Простая_функция(int x, int y)//В ней пересчитаем на экранные координаты
{
textout(0, x+w.leftclient, y+w.topclient, " "+format(x)+" "+format(y), 1);
}

function getmessage(0, WM_MOUSEMOVE)//Отлавливаем перемещешие мыши над окном
{
Простая_функция(message.x, message.y);//Перейдем в другую функцию
}

function getmessage(0, WM_CREATE)//Создаем контролы при создание окна
{
int hwnd=gethwnd(0);
SetMenuInfo(HMENU, address(#MENUINFO[0]));
SetMenu(hwnd, HMENU);

//Создание кнопок
b1=CreateWindow(0, "BUTTON", "Первая кнопка", 1342177280, 10, 10, 120, 30, hwnd, 0, 0, 0);
b2=CreateWindow(0, "BUTTON", "Ворая кнопка", 1342177280, 10, 50, 120, 30, hwnd, 0, 0, 0);
}

function getmessage(0, WM_COMMAND)
{
if (message.lparam==b1)messagebox ("Первая кнопка");
if (message.lparam==b2)messagebox ("Ворая кнопка");

}


function getmessage(0, 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(0, WM_RBUTTONDOWN)//Отлавливаем клик правой кнопки мыши всплывающее меню
{
w=window ("Диалог" );
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(0, WM_LBUTTONDOWN)//Отлавливаем клик левой кнопки мыши
{
beep(2500, 100);
}

function getmessage(0, 15)//WM_PAINT Отлавливаем обновление окна
{
textout(1, w.left, w.top, " Обновили окно ", 0);
sleep(100);
}

 
 Top
Zireael
Отправлено: 31 Января, 2019 - 18:48:04
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 4385
Дата рег-ции: Нояб. 2017  
Репутация: 580




Пример как добавить меню вызывающееся правой кнопкой мыши (Отобразить)
 
 Top
Kibor
Отправлено: 01 Февраля, 2019 - 16:49:34
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8091
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




Поправил обновление.
Была проблема с отловом всех сообщений.
Теперь ловит все.

Структура теперь содержит 5 переменные
 Цитата:

message.hwnd - HWND окна получившего сообщение
message.x - координата мыши X
message.y - координата мыши Y
message.wparam - определяет дополнительную информацию о сообщении. Точное значение зависит от значения члена структуры message
message.lparam - определяет дополнительную информацию о сообщении. Точное значение зависит от значения члена структуры message


Координаты x и y оконные.


Пример как сделать свои кнопки и отловить нажатие на них

CODE:
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );

createdialog(0);
showdialog(0, "Диалог",100, 100, 300, 300, 1, 1);

while(window ("Диалог")==0)sleep(10);
win w=window ("Диалог");

//Создание кнопок
int b1=CreateWindow(0, "BUTTON", "Первая кнопка", 1342177280, 10, 10, 120, 30, formatwi(w), 0, 0, 0);
int b2=CreateWindow(0, "BUTTON", "Ворая кнопка", 1342177280, 10, 50, 120, 30, formatwi(w), 0, 0, 0);



loop()sleep(1);




function getmessage(0, WM_COMMAND)
{
if (message.lparam==b1)messagebox ("Первая кнопка");
if (message.lparam==b2)messagebox ("Ворая кнопка");
}


Так можно добавлять любые контролы и создавать свой интерфейс.


Описание функции CreateWindowExA
 Цитата:
HWND CreateWindowEx(

DWORD dwExStyle, // улучшенный стиль окна
LPCTSTR lpClassName, // указатель на зарегистрированное имя класса
LPCTSTR lpWindowName, // указатель на имя окна
DWORD dwStyle, // стиль окна
int x, // горизонтальная позиция окна
int y, // вертикальная позиция окна
int nWidth, // ширина окна
int nHeight, // высота окна
HWND hWndParent, // дескриптор родительского или окна владельца
HMENU hMenu, // дескриптор меню или ID дочернего окна
HINSTANCE hInstance, // дескриптор экземпляра прикладной программы
LPVOID lpParam // указатель на данные создания окна

);



Для создания своих контролов ищите информацию как их создавать в WinApi и какие сообщения они генерируют.
 
 Top
Zireael
Отправлено: 01 Февраля, 2019 - 23:07:11
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 4385
Дата рег-ции: Нояб. 2017  
Репутация: 580




Пример как добавить checkbox (Отобразить)

Пример как добавить radiobox (Отобразить)

Пример как добавить несколько radiobox (Отобразить)
 
 Top
Kibor
Отправлено: 01 Февраля, 2019 - 23:31:15
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8091
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




Добавил функции
loword и hiword, что бы не надо было их вычислять таким образом:
CODE:
int cis=4294967290;

int a=address(#cis);
char c[4];
int b=address(#c[0]);
char c1[4];
int b1=address(#c1[0]);

c[0]=addressc(a);
c[1]=addressc(a+1);
c[2]=0;
c[3]=0;

c1[0]=addressc(a+2);
c1[1]=addressc(a+3);
c1[2]=0;
c1[3]=0;

int p=addressi(b);
int x=addressi(b1);

messagebox (p);
messagebox (x);


С помощью этих функций это делается так:
CODE:
int cis=4294967290;

int p=loword(cis);
int x=hiword(cis);

messagebox (p);
messagebox (x);



Пример создания и обработка ползунка и замена текста в static
CODE:
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );

external(INT, "SetScrollRange", "SetScrollRange", "User32.dll" );
external(INT, "SetScrollPos", "SetScrollPos", "User32.dll" );
external(INT, "SetWindowText", "SetWindowTextA", "User32.dll" );


int b1, b2, s1, hText, hwnd;

createdialog(0);
showdialog(0, "Диалог",100, 100, 300, 300, 1, 1);

win w=formatiw (hwnd);




int min=0, max=100, pos=95;
SetScrollRange(s1,2,min,max,1);
SetScrollPos(s1,2,pos,1);
Изменить_текст_и_прозрачность();




loop()sleep(1);

function Изменить_текст_и_прозрачность()
{
SetWindowText(hText, format(pos));
transparency(pos, w);
}


function getmessage(0, WM_COMMAND)
{
if (message.lparam==b1)messagebox ("Первая кнопка");
if (message.lparam==b2)messagebox ("Ворая кнопка");
}


function getmessage(0, WM_HSCROLL)
{
if (message.lparam==s1)
{

if (message.wparam==1 || message.wparam==3)//SB_LINERIGHT
{
pos=pos+10;
if (pos>max)pos=max;
SetScrollPos(s1,2,pos,1);
Изменить_текст_и_прозрачность();
return;
}
if (message.wparam==0 || message.wparam==2)//SB_LINELEFT
{
pos=pos-10;
if (pos<min)pos=min;
SetScrollPos(s1,2,pos,1);
Изменить_текст_и_прозрачность();
return;
}

///////////

if (loword(message.wparam)==5)//Зажали и двигаем
{
pos=pos-(pos-hiword(message.wparam));
if (pos>max)pos=max;
if (pos<min)pos=min;
SetScrollPos(s1,2,pos,1);
Изменить_текст_и_прозрачность();
}

}
}
//
function getmessage(0, WM_CREATE)//Создание кнопок
{
hwnd = gethwnd(0);
b1=CreateWindow(0, "BUTTON", "Первая кнопка", 1342177280, 10, 10, 120, 30, hwnd, 0, 0, 0);
b2=CreateWindow(0, "BUTTON", "Ворая кнопка", 1342177280, 10, 50, 120, 30, hwnd, 0, 0, 0);
s1=CreateWindow(0, "scrollbar", 0, 1342177280, 10, 100, 200, 20, hwnd, 0, 0, 0);
hText = CreateWindow(0, "STATIC", "",1342177280, 10, 150, 100, 15, hwnd, 0, 0, 0);
}


 
 Top
Dantes3000
Отправлено: 02 Февраля, 2019 - 00:51:16
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 1458
Дата рег-ции: Июнь 2016  
Репутация: 58




Сделать кнопку неактивной и изменить ее текст (Отобразить)
 
 Top
Budni
Отправлено: 02 Февраля, 2019 - 01:17:06
Post Id



Пользователь
Специалист


Покинул форум
Сообщений всего: 416
Дата рег-ции: Март 2018  
Репутация: 2




Так и должно быть? Подумал может ошибка (Отобразить)
 
 Top
Kibor
Отправлено: 02 Февраля, 2019 - 01:23:35
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8091
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




Кибор обновляется?
Обновите.
 
 Top
Budni
Отправлено: 02 Февраля, 2019 - 01:28:50
Post Id



Пользователь
Специалист


Покинул форум
Сообщений всего: 416
Дата рег-ции: Март 2018  
Репутация: 2




 Kibor пишет:
Кибор обновляется?
Обновите.

Да дело было в обновлении. А можно как то сделать чтобы координаты отображались под курсором без диалогового окна?
 
 Top
Kibor
Отправлено: 02 Февраля, 2019 - 01:35:33
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8091
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




 Budni пишет:
А можно как то сделать чтобы координаты отображались под курсором без диалогового окна?

CODE:
int x, y;
loop()
{
getmouse(x, y);
textout(0, x+20, y, format(x)+" "+format(y), 1);
sleep(10);
}


Вариант улучшенный
CODE:
int x, y, x1, y1;
loop()
{
getmouse(x, y);
if (x!=x1 || y!=y1)
{
textout(0, x+20, y, format(x)+" "+format(y), 1);
x1=x; y1=y;
}
sleep(10);
}
 
 Top
Страниц (16): [1] 2 3 4 5 6 7 8 9 » В конец
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« О программе Кибор »


Все гости форума могут просматривать этот раздел.
Только администраторы и модераторы могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 




Powered by