![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работать с окнами по составленному сценарию [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