Текущий архив: 2008.03.23;
Скачать: CL | DM;
Вниз
Работать с окнами по составленному сценарию Найти похожие ветки
← →
SKIPtr (2008-02-23 09:23) [0]Подскажите пожалуйста у меня есть список ListBox там записаны имена окн и что с ними нужно сделать Дальше я перебираю все окна чтоб найти окна с которыми буду выполнять соответствующие действия Как лучше производить сверку
Задача вроде постая но я хочу спросить кто это уже делал как лучше поступить а то изобретая велосипед боюсь вдруг получаться квадратные колеса
← →
Anatoly Podgoretsky © (2008-02-23 11:49) [1]Дык простая и есть if A = B then
← →
SKIPtr (2008-02-23 15:33) [2]В ListBox будет записано примерно информация окно с именем А закрыть окно с именем Б свернуть и программа должна обнаружить появление этих окон и выпрлнить соответствубщие действия так как это лучше
← →
Сергей М. © (2008-02-23 15:56) [3]
> окно с именем А
У окна нет имени.
← →
SKIPtr (2008-02-23 17:51) [4]под именем я имел заголовок окна ну или имя класса окна
← →
Сергей М. © (2008-02-23 18:36) [5]С заголовком и/или классом окна работает функция FindWindow[Ex]
Но, скажем, у окна кнопки (TButton) нет заголовка. Как будешь выкручиваться ?
← →
SKIPtr (2008-02-23 20:43) [6]программа должна работать с окнами которые видет FindWindow будет там заголовок или класс это для меня не принципиально когда у меня была только команда закрыть окно я брал строку с ListBox через FindWindow я получал доступ к этому окну и закрывал его И потом со следующей строкой тоже самое Если открыто несколько таких окон за несколько проходов они закрывались все Когда появилась команда свернуть FindWindow мне уже не даст доступ к всем окнам чтоб их свернуть так как быть
← →
Сергей М. © (2008-02-23 21:03) [7]
> программа должна работать с окнами которые видет FindWindow
FindWindow[Ex] "видит" любые окна, которые созданы "классически", т.е. с пом. CreateWindow[Ex]
> FindWindow мне уже не даст доступ к всем окнам
FindWindow ищет любые существующие верхнеуровневые окна текущего десктопа.
← →
SKIPtr (2008-02-24 07:20) [8]я пишу что оно не даст доступ ко всем окнам потому что окон может быть много а команда найдет ближайшее она не может вернуть ссылку на несколько окон
← →
Leonid Troyanovsky © (2008-02-24 10:23) [9]
> SKIPtr (24.02.08 07:20) [8]
RTFM: EnumWindows.
--
Regards, LVT.
← →
SKIPtr (2008-02-25 08:30) [10]Вот в начале я писал у меня есть список команд ListBox и список окон (или список не нужен?) мне нужен совет как лучше составить алгоритм сравнения этих списков
← →
Плохиш © (2008-02-25 10:44) [11]
> SKIPtr (25.02.08 08:30) [10]
Screen.Forms
← →
Leonid Troyanovsky © (2008-02-25 11:03) [12]
> SKIPtr (25.02.08 08:30) [10]
> Вот в начале я писал у меня есть список команд ListBox
> и список окон (или список не нужен?) мне нужен совет как
> лучше составить алгоритм сравнения этих списков
Для работы с окнами нужно:
1. Выбрать нужные окна, т.е. узнать их хендлы.
2. Установить на потоки, создавшие эти окна, хук WH_CALLWNDPROC*
для отслеживания валидности оных хендлов.
3. Применять к выбранным хендлам требуемые функции либо
слать им нужные сообщения.
Для выбора нужных окон необходимо использовать EnumWindows,
сравнивая, например, классы окон (GetClassName) и иную
имеющуюся информацию.
--
Regards, LVT.
← →
SKIPtr (2008-02-25 12:25) [13]
> Для выбора нужных окон необходимо использовать EnumWindows,
>
> сравнивая, например, классы окон (GetClassName) и иную
> имеющуюся информацию.
>
Тут дело в том меня интересуе не сами функции а как это реализовать ну например брать строку в ListBox и с этой строкой пройти по EnumWindows потом брать следующею строку и опять EnumWindows или находим текущий окно через EnumWindows пробегаем по строкам ListBox находим следующее окно и опять строки ListBox или есть еще какой другой метод
← →
Leonid Troyanovsky © (2008-02-25 14:33) [14]
> SKIPtr (25.02.08 12:25) [13]
> реализовать ну например брать строку в ListBox
Я ж описал алгоритм.
Листбокса тут явно не хватит, нужны более развитые структуры.
Во-первых, нужен список имен искомых классов,
во-вторых, список найденных хендлов окон.
Если сделать их полями формы, то ссылку на форму можно передать
в перечисляющую функцию в последнем параметре EnumWindows.
А сравнивать имена классов окон можно хоть StrLIComp.
Можно немного модифицировать [12], начиная с установки глобального
хука, который будет следить как за появлением окон верхнего уровня,
так и за их уничтожением, т.е., следить за актуальностью списка хендлов.
После установки хука делаем EnumWindows, или посылаем окнам
верхнего уровня широковещательный SendMessageTimeout.
--
Regards, LVT.
← →
Amoeba © (2008-02-25 16:26) [15]http://www.delphikingdom.com/asp/viewitem.asp?catalogid=432
← →
Leonid Troyanovsky © (2008-02-25 17:11) [16]
> 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.
← →
Leonid Troyanovsky © (2008-02-25 17:15) [17]
> Leonid Troyanovsky © (25.02.08 17:11) [16]
> function EnumProc (Wd: HWnd; Param: LongInt): Boolean; stdcall;
Да, во-ще, BOOL, если проявить занудство.
--
Regards, LVT.
Страницы: 1 вся ветка
Текущий архив: 2008.03.23;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.015 c