Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работать с окнами по составленному сценарию [D7, 95/98, XP]


SKIPtr ©   (2008-02-23 09:23:00) 

Подскажите пожалуйста  у меня есть список ListBox там записаны имена окн и что с ними нужно сделать Дальше я перебираю все окна чтоб найти окна с которыми буду выполнять соответствующие действия Как лучше производить сверку

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


Leonid Troyanovsky   (2008-02-25 17:15:00) [1]


> Leonid Troyanovsky ©   (25.02.08 17:11) [16]

> function EnumProc (Wd: HWnd; Param: LongInt): Boolean; stdcall;

Да, во-ще, BOOL, если проявить занудство.

--
Regards, LVT.


Leonid Troyanovsky   (2008-02-25 17:11:00) [2]


> Amoeba ©   (25.02.08 16:26) [15]

> http://www.delphikingdom.com/asp/viewitem.asp?catalogid=432


function EnumProc (Wd: HWnd; Param: LongInt): Boolean; stdcall; // Обязательно stdcall !!!
Var
   Nm:Array[0..255] of Char;  // буфер для имени
   Cs: Array[0..255] of Char; // буфер для класса
Begin
   GetWindowText(Wd,Nm,255); // считываем  текст заголовка окна
   GetClassName(Wd,Cs,255); // считываем название класса окна
   ListBox1.Items.Add

Обязательно передаем в Param ссылку на ListBox1 (или FormX)!!!

Ну, для первого знакомства, ничего, сойдет ;)

--
Regards, LVT.


Amoeba   (2008-02-25 16:26:00) [3]

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=432


Leonid Troyanovsky   (2008-02-25 14:33:00) [4]


> SKIPtr   (25.02.08 12:25) [13]

> реализовать ну например брать строку в ListBox

Я ж описал алгоритм.

Листбокса тут явно не хватит, нужны более развитые структуры.
Во-первых, нужен список имен искомых классов,
во-вторых, список найденных хендлов окон.

Если сделать их полями формы, то ссылку на форму можно передать
в перечисляющую функцию в последнем параметре EnumWindows.
А сравнивать имена классов окон можно хоть StrLIComp.

Можно немного модифицировать [12], начиная с установки глобального
хука, который будет следить как за появлением окон верхнего уровня,
так и за их уничтожением, т.е., следить за актуальностью списка хендлов.
После установки хука делаем EnumWindows, или посылаем окнам
верхнего уровня широковещательный SendMessageTimeout.

--
Regards, LVT.


SKIPtr   (2008-02-25 12:25:00) [5]


> Для выбора нужных окон необходимо использовать EnumWindows,
>
> сравнивая, например, классы окон (GetClassName) и иную
> имеющуюся информацию.
>

Тут дело в том меня интересуе не сами функции а как это реализовать ну например брать строку в ListBox и с этой строкой пройти по EnumWindows потом брать следующею строку и опять EnumWindows или находим текущий окно через EnumWindows пробегаем по строкам ListBox находим следующее окно и опять строки ListBox или есть еще какой другой метод


Leonid Troyanovsky   (2008-02-25 11:03:00) [6]


> SKIPtr   (25.02.08 08:30) [10]

> Вот в начале я писал у меня есть список команд ListBox  
> и список окон (или список не нужен?)  мне нужен совет как
> лучше составить алгоритм сравнения этих списков

Для работы с окнами нужно:
1. Выбрать нужные окна, т.е. узнать их хендлы.
2. Установить на потоки, создавшие эти окна, хук WH_CALLWNDPROC*
для отслеживания валидности оных хендлов.
3. Применять к выбранным хендлам требуемые функции либо
слать им нужные сообщения.

Для выбора нужных окон необходимо использовать EnumWindows,
сравнивая, например, классы окон (GetClassName) и иную
имеющуюся информацию.

--
Regards, LVT.


Плохиш   (2008-02-25 10:44:00) [7]


> SKIPtr   (25.02.08 08:30) [10]

Screen.Forms


SKIPtr   (2008-02-25 08:30:00) [8]

Вот в начале я писал у меня есть список команд ListBox  и список окон (или список не нужен?)  мне нужен совет как лучше составить алгоритм сравнения этих списков


Leonid Troyanovsky   (2008-02-24 10:23:00) [9]


> SKIPtr   (24.02.08 07:20) [8]

RTFM: EnumWindows.

--
Regards, LVT.


SKIPtr   (2008-02-24 07:20:00) [10]

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


Сергей М.   (2008-02-23 21:03:00) [11]


> программа должна работать с окнами которые видет  FindWindow


FindWindow[Ex] "видит" любые окна, которые созданы "классически", т.е. с пом. CreateWindow[Ex]


> FindWindow мне уже не даст доступ к всем окнам


FindWindow ищет любые существующиеверхнеуровневые окна текущего десктопа.


SKIPtr   (2008-02-23 20:43:00) [12]

программа должна работать с окнами которые видет  FindWindow будет там заголовок или класс это для меня не принципиально когда у меня была только команда закрыть окно я брал строку с ListBox через FindWindow я получал доступ к этому окну и закрывал его И потом со следующей строкой тоже самое Если открыто несколько таких окон за несколько проходов они закрывались все Когда появилась команда свернуть FindWindow мне уже не даст доступ к всем окнам чтоб их свернуть так как быть


Сергей М.   (2008-02-23 18:36:00) [13]

С заголовком и/или классом окна работает функция FindWindow[Ex]

Но, скажем, у окна кнопки (TButton) нет заголовка. Как будешь выкручиваться ?


SKIPtr   (2008-02-23 17:51:00) [14]

под именем я имел заголовок окна ну или имя класса окна


Сергей М.   (2008-02-23 15:56:00) [15]


> окно с именем А


У окна нет имени.


SKIPtr   (2008-02-23 15:33:00) [16]

В ListBox будет записано примерно информация   окно с именем А закрыть окно с именем Б свернуть и программа должна обнаружить появление этих окон и выпрлнить соответствубщие действия так как это лучше


Anatoly Podgoretsky   (2008-02-23 11:49:00) [17]

Дык простая и есть if A = B then


Наверх

Титульная страница Поиск, карта сайта Написать письмо