Кибор » Кибор - Интегрированная среда разработки ботов » Вопросы и решение проблем » привязка контрола по имени окна

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

1. Geoteh - 16 Февраля, 2024 - 05:11:06 - перейти к сообщению
как правильно будет реализовать привязку контрола по имени окна ?
если брать такой код
CODE:
W_Kib=window (-1, -1, -1, -1, 960, 540, window (text_edit5[0]));
все хорошо только если в системе запущенно только одно такое окно а если их 2 и больше то он не работает
2. Kibor - 16 Февраля, 2024 - 05:20:38 - перейти к сообщению
(для просмотра ссылки Вам необходимо авторизоваться) А там дальше выбирайте как хотите. В зависимости от ситуации.
К примеру можно отследить новое окно даже если их было до этого много таких.
Сначала сканируем что было. Затем запускаем новое.
опять сканируем и находим новое.

Для того что бы решить задачу программно надо решить ее в голове. На одной функции не уедешь.
Вы бы как отследили этот контрол?
Кибор дает все возможные параметры. Ими манипулируйте.
3. Geoteh - 16 Февраля, 2024 - 06:03:26 - перейти к сообщению
спасибо разобрался ))) в моем случае окон с одинаковыми контролами может быть несколько а вот их имена разные и при привязке использую 2 параметра, размер контрола и имя окна, спасибо за пример теперь понял как делать

вдруг кому-то еще пригодится (естественно можно и более чаятельно но в моем случае простенько нужно)
CODE:
win w[5];
int k=window (#w[0], text_edit5[0]);
for (int n=0; n<k; n++)
{
W_Kib=window (-1, -1, -1, -1, 960, 540, window (text_edit5[0]));
}
4. Zireael - 17 Февраля, 2024 - 02:22:43 - перейти к сообщению
 Цитата:
for (int n=0; n<k; n++)
{
W_Kib=window (-1, -1, -1, -1, 960, 540, window (text_edit5[0]));
}

Зачем тут цикл? Несколько раз выполнить одну и ту же строчку?
5. Geoteh - 24 Февраля, 2024 - 04:08:06 - перейти к сообщению
наконец то разобрался с этой темой Улыбка спасибо Zireael за помочь и нервы )))
будет полезно тем кто использует эмуляторы андроида типо Nox, Memu, LD как альтернативную привязку к контролу не используя к примеру
CODE:
win w;
int x, y;
int ind=1;//если 0 - на главное окно
getmouse(x, y);
w=getwindow(ind, x, y);

суть вот в чем из доступных открытых окон выбираем нужное и получаем указатель на конрол этого окна и дальше бот будет работать с ним
за основу был взят код который предоставил Zireael в одной из тем

CODE:
#define WS_VISIBLE 268435456
#define WS_CHILD 1073741824
#define WS_VSCROLL 2097152
#define CBS_DROPDOWNLIST 3
#define WS_HSCROLL 1048576
#define CB_ADDSTRING 323
#define CB_GETCURSEL 327
#define CB_SETDROPPEDWIDTH 352
#define WS_EX_TOOLWINDOW 128
#define WS_EX_APPWINDOW 262144
#define GWL_STYLE -16
#define CBN_CLOSEUP 8
external(INT, "GetTextExtentPoint32", "GetTextExtentPoint32A", "Gdi32.dll" );
external(INT, "GetDC", "GetDC", "User32.dll" );
external(INT, "FindWindowEx", "FindWindowExA", "User32.dll" );
external(INT, "GetWindowText", "GetWindowTextA", "User32.dll" );
external(INT, "IsWindowVisible", "IsWindowVisible", "User32.dll" );
external(INT, "IsIconic", "IsIconic", "User32.dll" );
external(INT, "GetWindowLong", "GetWindowLongA", "User32.dll" );
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );

external(INT, "GetWindowThreadProcessId", "GetWindowThreadProcessId", "User32.dll");

int combo, row, count_window;
int hdc, max_length=0;
string name[9999];

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

win K = formatiw(0);
while(K==0) sleep(10); // ждать пока не будет выбрано окно

loop()
{
if (K)
{
int pid=0;
if(GetWindowThreadProcessId(formatwi(K), address(#pid)))
{
win w[100];
int p=listwinprocess(#w[0], pid);
for (int n=0; n<p; n++)
{
setwindowparam (w[n])
}
textbkcolor(255, 65280);
textout(0, 300, 480, "указатель на контрол: "+w.name[0]+" "+w.class[0]+" "+format(w.left[0])+" "+format(w.widthclient[0]), 1);
textout(1, 300, 500, "указатель на окно: "+w.name[1]+" "+w.class[1]+" "+format(w.left[1])+" "+format(w.widthclient[1]), 1);
}
}
}


function getmessage(0, WM_CREATE)
{
combo=CreateWindow(0, "COMBOBOX", "", CBS_DROPDOWNLIST | WS_HSCROLL | WS_VSCROLL | WS_VISIBLE | WS_CHILD, 10, 10, 140, 160, gethwnd(0), 0, 0, 0);
count_window = find_window_taskbar(#name[0], sizearray(name)); // поиск окон, которые могут быть на панели задач
//messagebox("Найдено окон: "+format(count_window));
hdc=GetDC(combo);
for(int i=0; i<count_window; i++)add_combo(name[i]); // добавление строк в combo
}

function add_combo(string s)
{
int SIZE[2];
new char c[size(s)+1];
strcpy(#c[0], s);
GetTextExtentPoint32(hdc, address(#c[0]), sizearray(c), address(#SIZE[0])); // узнать длину текста в пикселях
if(max_length<SIZE[0])
{
max_length=SIZE[0]; // запомнить максимальную длину строки
sendmessage(CB_SETDROPPEDWIDTH, SIZE[0], 0, formatiw(combo)); // установить ширину для combo
}
sendmessage(CB_ADDSTRING, 0, address(#c[0]), formatiw(combo));
delete c;
}

function getmessage(0, WM_COMMAND)
{
if (message.lparam==combo && hiword(message.wparam) == CBN_CLOSEUP) // если выбрана строка combo
{
row=sendmessage(CB_GETCURSEL, 0, 0, formatiw(combo)); // узнаём номер выбранной строки
if(row>-1)
{
K = window(name[row]); // найти окно по имени
//textbkcolor(255, 65280);
//textout(0, 300, 480, "Выбранная строка: "+name[row], 1);
}
}
}

function find_window_taskbar(string #handle2, int size_handle2)
{
char name[999], class[999];
int h, count_handle=0, count=0, style, handle_window[9999];
h=FindWindowEx(0, 0, 0, 0); // поиск всех окон
while(h && count_handle < sizearray(handle_window))
{handle_window[count_handle]=h; count_handle++; h=FindWindowEx(0, h, 0, 0);}

for(int i=0; i<count_handle; i++)
{
if(IsWindowVisible(handle_window[i]) || IsIconic(handle_window[i])) // если окно видимо или свёрнуто
{
if(GetWindowText(handle_window[i], address(#name[0]), sizearray(name))) // если имеет имя окна
{
style=GetWindowLong(handle_window[i], GWL_STYLE); // получить стиль окна
double style_d = style - 2147483647 + 2147483647;
if(bitand(style_d, WS_EX_TOOLWINDOW) || bitand(style_d, WS_EX_APPWINDOW))
{
if(size_handle2-1<count)return count;
handle2[count]=format(#name[0]); count++;
}
}
}
}
return count;
}

function bitand(double num, int flag)
{
int i=0, j=0, z;
while (flag>1){flag=flag/2; i++;}
while (j<=i){z=mod(num, 2); num=num/2; j++;}
if(z)return 1; return 0;
}

function mod(double x, int y){int z=x/y; return x-z*y;}

Powered by ExBB FM 1.0 Final