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;
Выводит очень большой список, а мне нужно только список тех окон, которые открыты. Мне надо найти окно по части имени, вот и решил перебрать все окна
Client, вот для кого я писал, "Как не нужно писать программы"? Я ж там объяснял, что лишние операторы @ - зло, и от них надо избавляться. А ты опять делаешь "это" А почему тебе понадобился @? Потому, что если массив начинается НЕ с нулевого элемента, а с первого, как у тебя, то его уже нельзя привести к 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;