Эксперт
Покинул форум
Сообщений всего: 4466
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: 2. Есть ли возможность получить список всех открытых окон и передать их в комбосписок немодального диалогового окна?
code (Отобразить)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
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" );
int combo, row, count_window;
int hdc, max_length=0;
string name[9999];
//////////
createdialog(0);
showdialog(0, "Диалог", 300, 300, 500, 300, 1, 1);
//////////
// тут сам скрипт
loop() sleep(10);
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) // если выбрана строка combo
{
row=sendmessage(CB_GETCURSEL, 0, 0, formatiw(combo)); // узнаём номер выбранной строки
if(row>-1)
{
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;}
Отобразит список окон, которые есть на панели задач.(Отредактировано автором: 24 Мая, 2019 - 12:50:02) |