1. mrPuh - 10 Августа, 2015 - 09:14:35 - перейти к сообщению
Как получить координаты окна по указателю?
2. Kibor - 10 Августа, 2015 - 13:44:37 - перейти к сообщению
mrPuh пишет:
Как получить координаты окна по указателю?
Опять использовать Api. Функцию GetWindowRect
Описание ее и описание структуры RECT смотреть в интернете
CODE:
external(INT, "My_GetWindowRect", "GetWindowRect", "user32.dll");
int hwnd=w[x];//То что получили с помощью FindWindowExA (http://kibor-bot.com/forum/topic.php?forum=5&topic=336&postid=1439191324#1439191324)
char poz_siz[16];//Это для заполнения структуры RECT
/*
typedef struct _RECT {
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT, *PRECT;
*/
// LONG имеет 4 байта. Значит вся полная структура 16
My_GetWindowRect(hwnd, address(#poz_siz[0]));
//Тут разберем структуру по 4 байта.
int t[4];
t[0]=addressi(address(#poz_siz[0]));
messagebox ("Левый угол Y "+format(t[0]));
t[1]=addressi(address(#poz_siz[4]));
messagebox ("Левый угол Y "+format(t[1]));
t[2]=addressi(address(#poz_siz[8]))-t[0];
messagebox ("Размер X "+format(t[2]));
t[3]=addressi(address(#poz_siz[12]))-t[1];
messagebox ("Размер Y "+format(t[3]));
int hwnd=w[x];//То что получили с помощью FindWindowExA (http://kibor-bot.com/forum/topic.php?forum=5&topic=336&postid=1439191324#1439191324)
char poz_siz[16];//Это для заполнения структуры RECT
/*
typedef struct _RECT {
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT, *PRECT;
*/
// LONG имеет 4 байта. Значит вся полная структура 16
My_GetWindowRect(hwnd, address(#poz_siz[0]));
//Тут разберем структуру по 4 байта.
int t[4];
t[0]=addressi(address(#poz_siz[0]));
messagebox ("Левый угол Y "+format(t[0]));
t[1]=addressi(address(#poz_siz[4]));
messagebox ("Левый угол Y "+format(t[1]));
t[2]=addressi(address(#poz_siz[8]))-t[0];
messagebox ("Размер X "+format(t[2]));
t[3]=addressi(address(#poz_siz[12]))-t[1];
messagebox ("Размер Y "+format(t[3]));
(Добавление)
Исправил код. Была ошибка в расчете ширины и высоты.
3. mrPuh - 11 Августа, 2015 - 00:26:44 - перейти к сообщению
Kibor!
Помоги, пожалуйста, устранить ошибку.
Как я понял ругается на "int hwnd=w[x];".
Помоги, пожалуйста, устранить ошибку.
Как я понял ругается на "int hwnd=w[x];".
CODE:
external(INT, "my_windows", "FindWindowExA", "user32.dll");
external(VOID, "my_getname", "GetWindowTextA", "user32.dll");
external(INT, "My_GetWindowRect", "GetWindowRect", "user32.dll");
string hh="Блокнот";
char t[25];
strcpy(#t[0],hh);
int ss=size(#t[0]);
int si;
int y;
int x;
string all[500];
char h[512];
int adr=address(#h[0]);
int a=my_windows(0, 0, 0, 0);
win w[500];
int n=0;
s: if (a!=0)
{
h[0]=formatic(0);
my_getname(a, adr, 512);
si=size(#h[0]);
if (pr()==-1) goto nn;
all[n]=format(#h[0]);
w[n]=formatiw(a);
n++;
nn: a=my_windows(0, a, 0, 0);
goto s;
}
for (x=0; x<n; x++)
{
w.name[x]=all[x];
w.width[x]=737;
w.height[x]=696;
w.left[x]=0;
w.top[x]=0;
movewindow(w[x]);
int hwnd=w[x];//Òî ÷òî ïîëó÷èëè ñ ïîìîùüþ FindWindowExA (http://kibor-bot.com/forum/topic.php?forum=5&topic=336&postid=1439191324#1439191324)
char poz_siz[16];//Ýòî äëÿ çàïîëíåíèÿ ñòðóêòóðû RECT
/*
typedef struct _RECT {
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT, *PRECT;
*/
// LONG èìååò 4 áàéòà. Çíà÷èò âñÿ ïîëíàÿ ñòðóêòóðà 16
My_GetWindowRect(hwnd, address(#poz_siz[0]));
//Òóò ðàçáåðåì ñòðóêòóðó ïî 4 áàéòà.
int tp[4];
tp[0]=addressi(address(#poz_siz[0]));
messagebox ("Ëåâûé óãîë Y "+format(tp[0]));
tp[1]=addressi(address(#poz_siz[4]));
messagebox ("Ëåâûé óãîë Y "+format(tp[1]));
tp[2]=addressi(address(#poz_siz[8]))-tp[0];
messagebox ("Ðàçìåð X "+format(tp[2]));
tp[3]=addressi(address(#poz_siz[12]))-tp[1];
messagebox ("Ðàçìåð Y "+format(tp[3]));
}
function pr()
{
for (int j=0; j<si-ss+1; j++)
{
y=j;
for (int b=0; b<ss; b++)
{
if (h[y]!=t[b])goto d;
y++;
}
return 1;
d:;
}
return -1;
}
external(INT, "my_windows", "FindWindowExA", "user32.dll");
external(VOID, "my_getname", "GetWindowTextA", "user32.dll");
external(INT, "My_GetWindowRect", "GetWindowRect", "user32.dll");
string hh="Блокнот";
char t[25];
strcpy(#t[0],hh);
int ss=size(#t[0]);
int si;
int y;
int x;
string all[500];
char h[512];
int adr=address(#h[0]);
int a=my_windows(0, 0, 0, 0);
win w[500];
int n=0;
s: if (a!=0)
{
h[0]=formatic(0);
my_getname(a, adr, 512);
si=size(#h[0]);
if (pr()==-1) goto nn;
all[n]=format(#h[0]);
w[n]=formatiw(a);
n++;
nn: a=my_windows(0, a, 0, 0);
goto s;
}
for (x=0; x<n; x++)
{
w.name[x]=all[x];
w.width[x]=737;
w.height[x]=696;
w.left[x]=0;
w.top[x]=0;
movewindow(w[x]);
int hwnd=w[x];//Òî ÷òî ïîëó÷èëè ñ ïîìîùüþ FindWindowExA (http://kibor-bot.com/forum/topic.php?forum=5&topic=336&postid=1439191324#1439191324)
char poz_siz[16];//Ýòî äëÿ çàïîëíåíèÿ ñòðóêòóðû RECT
/*
typedef struct _RECT {
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT, *PRECT;
*/
// LONG èìååò 4 áàéòà. Çíà÷èò âñÿ ïîëíàÿ ñòðóêòóðà 16
My_GetWindowRect(hwnd, address(#poz_siz[0]));
//Òóò ðàçáåðåì ñòðóêòóðó ïî 4 áàéòà.
int tp[4];
tp[0]=addressi(address(#poz_siz[0]));
messagebox ("Ëåâûé óãîë Y "+format(tp[0]));
tp[1]=addressi(address(#poz_siz[4]));
messagebox ("Ëåâûé óãîë Y "+format(tp[1]));
tp[2]=addressi(address(#poz_siz[8]))-tp[0];
messagebox ("Ðàçìåð X "+format(tp[2]));
tp[3]=addressi(address(#poz_siz[12]))-tp[1];
messagebox ("Ðàçìåð Y "+format(tp[3]));
}
function pr()
{
for (int j=0; j<si-ss+1; j++)
{
y=j;
for (int b=0; b<ss; b++)
{
if (h[y]!=t[b])goto d;
y++;
}
return 1;
d:;
}
return -1;
}
4. Kibor - 11 Августа, 2015 - 03:42:14 - перейти к сообщению
(для просмотра ссылки Вам необходимо авторизоваться)
win - это внутренняя переменная Кибор. В ней находится HWND (указатель), а так же структура w.top w.left и тд. Обращаться как к переменной напрямую к ней нельзя. только использовать в внутренних функциях кибор..
На самом деле HWND это числовое значение 4 байта целое.
поэтому при получение и работе в WinApi с HWND использовать int.
Если надо записывать win в int и наоборот надо их приводить друг к другу с помощью функций как написал
Цитата:
Добавлены функции конвертации значения указателя win в int и наоборот. Это позволяет производить с указателями любые математические операции, сравнение указателей и вывод их в виде числа на экран.
formatwi - преобразует указатель win к int
CODE:
win wind=selectwindow ("Имя Окна");
int a=formatwi(wind);
formatiw - преобразует int к win
CODE:
int a=344535;
win wind=formatiw(a);
formatwi - преобразует указатель win к int
CODE:
win wind=selectwindow ("Имя Окна");
int a=formatwi(wind);
formatiw - преобразует int к win
CODE:
int a=344535;
win wind=formatiw(a);
Цитата:
win w[500];
int hwnd=w[x];
int hwnd=w[x];
win - это внутренняя переменная Кибор. В ней находится HWND (указатель), а так же структура w.top w.left и тд. Обращаться как к переменной напрямую к ней нельзя. только использовать в внутренних функциях кибор..
На самом деле HWND это числовое значение 4 байта целое.
поэтому при получение и работе в WinApi с HWND использовать int.
Если надо записывать win в int и наоборот надо их приводить друг к другу с помощью функций как написал
5. mrPuh - 11 Августа, 2015 - 04:32:04 - перейти к сообщению
Все заработало! Большое спасибо, Kibor!
Теперь (вроде) все есть для реализации моего проекта.
Теперь (вроде) все есть для реализации моего проекта.