Помощь - Поиск - Пользователи - Календарь
Полная версия: перебор окон
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Client
погуглив, получил такой код
function enumproc(wnd:hwnd; lparam:lparam):BOOL; stdcall;
var
s,ss:array [1..30] of char;
s1:string [30];
begin
GetClassName(wnd,@s,20);
GetWindowText(wnd,@ss,20);
form3.Memo1.Lines.Add(ss);
Result:=true;
end;


procedure TForm3.Button1Click(Sender: TObject);
var
wnd,wnd1,wnd2:hwnd;
s: array [1..30] of char;
begin
Memo1.Clear;
EnumWindows(@enumproc,0)
end;
Выводит очень большой список, а мне нужно только список тех окон, которые открыты. Мне надо найти окно по части имени, вот и решил перебрать все окна smile.gif
volvo
IsWindowVisible в помощь ...
Client
спасибо, все работает good.gif give_rose.gif
volvo
Можно еще отсечь все дочерние окна, будет еще лучше работать:

if IsWindowVisible(wnd) and (GetWindow(wnd, GW_OWNER) = 0) then
Client
выводит всего лишь одно "лишнее" окно Program Manager (а что это за окно?)
еще раз спасибо, все получилось smile.gif
volvo
Client, вот для кого я писал, "Как не нужно писать программы"? Я ж там объяснял, что лишние операторы @ - зло, и от них надо избавляться. А ты опять делаешь "это" smile.gif А почему тебе понадобился @? Потому, что если массив начинается НЕ с нулевого элемента, а с первого, как у тебя, то его уже нельзя привести к PChar/PWideChar автоматически, и тебе приходится "затыкать компилятору рот".

И еще. Зачем в коллбек-функции ты должен обращаться к элементу формы? Не надо этого делать. Ты ж все равно не используешь второй параметр, передаешь туда 0? Так используй... Все просто:

function EnumProc(wnd: HWND; myLParam: LPARAM): BOOL; stdcall;
const
maxLen = 30;
var
s, ss: array[0 .. maxLen] of char;
begin
if IsWindowVisible(wnd) and (GetWindow(Wnd, GW_OWNER) = 0) then
begin
GetClassName(wnd, s, maxLen);
GetWindowText(wnd, ss, maxLen);
if ss <> '' then TStrings(myLParam).Add(ss);
end;
Result := true;
end;

procedure TForm3.Button1Click(Sender: TObject);
begin
Memo1.Clear;
EnumWindows(@enumproc, LPARAM(Memo1.Lines))
end;

Client
Цитата
что лишние операторы @
Помню, что это как поинтер и с ним компилятор успакаивается smile.gif Это было в примере, если неправильный прототип функции был (вроде enum...). А про массив и PChar даже не знал, как увидел такой пример, так и делал по-нему.
Про "чудо-параметр". тип LParam вроде тот же Integer. Но через него передается целый массив строк wacko.gif
Это указатель что-ли? по описанию
Цитата
Устанавливает 32-разрядное, определяемое программой значение, которое будет передано в функцию повторного вызова.
Прям уличная магия smile.gif

Спасибо за помощь и объяснения!
volvo
Цитата
LParam вроде тот же Integer. Но через него передается целый массив строк
Стоп, стоп, стоп. Во-первых, не массив строк, а TStrings, то есть дельфийский класс. То есть, указатель на него. Который имеет ту же длину, что и LPARAM. Так что никакой магии - только ловкость рук smile.gif

Во вторых:
Цитата
А про массив и PChar даже не знал, как увидел такой пример, так и делал по-нему.
А к первоисточнику обратиться не пробовал? Вот описание функции MSDN -> GetClassName. Что видим?

Цитата
int WINAPI GetClassName(
__in HWND hWnd,
__out LPTSTR lpClassName, // <--- Вот то, что нужно !!!
__in int nMaxCount
);

LPTSTR видел? А что это такое, расскажешь мне? smile.gif Напечатай в IDE Delphi и подведи мышь. Мне, например, показывается вот такое сообщение: "LPTSTR - System.PWideChar". Это в 2009-ой, в ранних версиях будет PChar. Опять магия? smile.gif

Client
про массивы это я преувеличил маленька.. smile.gif
Цитата
Так что никакой магии - только ловкость рук
т.е. можно передать указатель хоть на что?
Цитата
LPTSTR видел?
Увидел. только мало о чем говорило smile.gif а зачем столько "типов" LPSTR, LPCSTR, LPTSTR и еще много ))
И что значат __out и __in в описании? это же СИ -шное описание, т.е. это зарезервированые слова? или только для информативности?
Цитата
Опять магия?
Определенно магия, только вот какая - черная или нет... smile.gif smile.gif
volvo
Цитата
т.е. можно передать указатель хоть на что?
Угу. По крайней мере на любой класс VCL и RTL.

Цитата
а зачем столько "типов" LPSTR, LPCSTR, LPTSTR и еще много ))
А затем, что они все обозначают разные вещи. По крайней мере в С (что ни говори, а WinAPI изначально пишется под С, так что надо пользоваться теми типами, которые пришли оттуда). Я не просто так всегда говорю: пользуйтесь правильными типами переменных, а не просто подходящими. Сегодня WPARAM - это Integer, завтра положение может поменяться.

В частности,
LPSTR - указатель на строку
LPCSTR - константный указатель на строку
LPTSTR - указатель на массив TCHAR-ов
LPCTSTR - константный указатель на массив TCHAR-ов
В зависимости от того, Юникодный или нет проект - все 4 типа могут быть различными...

Цитата
И что значат __out и __in в описании? это же СИ -шное описание, т.е. это зарезервированые слова? или только для информативности?
Без понятия, я не пользуюсь Microsoft-овскими компиляторами, а для себя сделал очень просто:
#define __in
#define __out
т.е., ассоциировать __in, __out и еще несколько таких параметров с пустотой, чтоб не выдавало ошибок при компиляции, так что теперь у меня "бесплатный" довесок, показывающий, входной это параметр функции, или выходной... smile.gif
Client
Цитата
Угу. По крайней мере на любой класс VCL и RTL.
Понятно
Цитата
По крайней мере в С
Подозревал, что так и есть smile.gif
Цитата
а для себя сделал очень просто
хитро, хитро smile.gif
volvo
Мне, кстати, проще. Меня Ада приучила к точному описанию типов - никаких отступлений, никаких авто-преобразований. Вот, смотри:
1) попробуем написать CallBack-функцию, используя не нужные типы, а замену:
Нажмите для просмотра прикрепленного файла
Что видим? Не получилось обмануть компилятор, это не тот прототип, программа компилироваться отказалась.

2) Чуть-чуть поправим программу, сделаем правильный прототип, но вызовем EnumWindows как процедуру, без обработки возвращаемого значения:
Нажмите для просмотра прикрепленного файла
Что? Опять не то, "Нельзя использовать функцию EnumWindows как процедуру"

3) Ну хорошо, уговорили, пускай она возвращает результат...
Нажмите для просмотра прикрепленного файла
Вот теперь все в порядке, откомпилировано...

Вот так и привыкаешь аккуратно использовать типы smile.gif
Client
здорово smile.gif
буду стараться замечать больше мелочей и запоминать.
P.S. а что за IDE?
volvo
Цитата
а что за IDE?


The GNAT Programming Studio
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.