![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Plamenk |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 258 Регистрация: 18.2.2003 Репутация: нет Всего: 3 |
Как можно получить список всех выполняющихся приложений, т.е. те которые можно переключать с помощью Alt+Tab.
Заранее всем СПАСИБО! |
|||
|
||||
| GriKo |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 7.6.2003 Где: Израиль Репутация: нет Всего: нет |
Через WinAPI можно... Функция GetWindow называется, помоему.
|
|||
|
||||
| Plamenk |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 258 Регистрация: 18.2.2003 Репутация: нет Всего: 3 |
Мне нужно получить список не зная ни HWND окна, ни PID процесса, так что GetWindow() не поможет.
Это сообщение отредактировал(а) Plamenk - 30.7.2003, 19:00 |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Перечисляй все окна, находящиеся сразу под корневым (рабочим столом) с помощью EnumWindows() или так:
Это сообщение отредактировал(а) mr.DUDA - 30.7.2003, 21:30 -------------------- ![]() |
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
EnumWindows специально для этого и предназначена.
|
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Да, но придется писать callback-функцию, легче все-таки циклом.
Зы, кстати на один процесс приходится (обычно) 2-10 окон, так что нужно сделать проверку при добавлении в список процессов - есть ли такой. А еще будет туча геморойных системных окошек со своими процессами -------------------- ![]() |
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Нормальное приложение не будет все подряд окна с NULL в качестве родительского окна использовать и они в перебор не попадут. Именно по-этому не следует использовать в своих приложениях MessageBox(NULL,......). А надо ли проверять процессы это пусть хозяин топика сам думает, например, если запустить Word несколько раз, то, нажав Ctrl+Alt+Del, мы увидим кучу приложений Word и один единственный процесс WINWORD.EXE. Это сообщение отредактировал(а) RAN - 31.7.2003, 12:11 |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Как насчет чтобы убедиться: ![]() И вообще-то NULL в FindWindowEx означает не дескриптор десктопного окна, а то что искать надо под десктопом. Это корень всех окон. Создавая окно без родителя, ты создаешь его под десктопом. -------------------- ![]() |
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
А я и говорю EnumWindows используйте, она по уровням не скачет, а перебирает только окна высшего уровня, а FindWindowEx все, что ниже указанного.
именно дескриптор десктопа и есть. |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
RAN, зайди в Spy++ и посмотри Handle своего окна Desktop.
На скрине он равен 0x80. Как и любой другой дескриптор, HWND равный нулю не является дескриптором существующего объекта. Можешь спросить у ASM'еров, они тебе подробно объяснят почему. Это сообщение отредактировал(а) mr.DUDA - 31.7.2003, 13:10 -------------------- ![]() |
|||
|
||||
| Ziga |
|
|||
|
Unregistered |
1) ispolzuj Tool Help API (v MSDN ilji poischi v http://msdn.microsoft.com/).
vot chto pro nhjevo pishet v helpe "The functions provided by the tool help library make it easier for you to obtain information about currently executing Win32®-based applications. These functions are designed to streamline the creation of Win32-hosted tools, specifically debuggers." 2) nje hochu sovratj, no na skolko pomnju, MS Performance Monitor plzovaljsa kakimi to COM interfeisami dlja poluchhenjija sistemnoi informaciji, i eti interfaces mozjno ispoljzovatj v svoih aplikacijah. gdjeto v i-nete bilji samples. |
|||
|
||||
| Plamenk |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 258 Регистрация: 18.2.2003 Репутация: нет Всего: 3 |
Дело в том, что перечислая окна с помощью EnumWindow() или FindWindow() я нахожу все окна, большинство из которых мне ненужны, а вопрос именно в том, как отфильтровать именно те приложения которые можно переключать с помощью Alt+Tab.
|
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
mr.DUDA, при чём тут asm. Я прекрасно понимаю, что NULL - это не дескриптор, но указание NULL в функциях API вместо дескриптора окна, указывают функции использовать десктоп. Как может NULL быть дескриптором, если это по сути указатель на структуру с инфой об окне.
|
|||
|
||||
| mr.DUDA |
|
||||||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
про дескрипторы - в ответ на это
а про то, как отфильтровать - EnumDesktopWindows перечисляет только
Если бы не гемор с тучей левых окон, можно было бы юзать EnumWindows, а так конечно придется вызывать GetProcessWindowStation /EnumDesktops/EnumDesktopWindows. -------------------- ![]() |
||||||
|
|||||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
mr.DUDA, я имел ввиду, что NULL в качестве первого параметра FindWindowEx не является дескриптором, но означает дескриптор десктопного окна, а можно и указать дескриптор другого окно.
P.S. Простите за флейм, не смог удержаться, каюсь |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
-------------------- ![]() |
|||
|
||||
| alexht |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 1.8.2003 Репутация: нет Всего: нет |
Не знаю про NULL, но чето похожее на макрос HWND_DESKTOPWINDOW стопудово и есть ханд окна стола.
|
|||
|
||||
| mr.DUDA |
|
||||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Это что ли
макроса я не нашел Это сообщение отредактировал(а) mr.DUDA - 1.8.2003, 14:10 -------------------- ![]() |
||||
|
|||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
Утверждать, конечно, не берусь, но если это подтвердиться, то вы можете у каждого окна проверять это свойство. Таким образом, можно отфильтровать окна -------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| Гость_brb |
|
|||
|
Unregistered |
Step, o5 2! |
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| Unregistered |
|
|||
|
Unregistered |
опять двойка!
|
|||
|
||||
| Plamenk |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 258 Регистрация: 18.2.2003 Репутация: нет Всего: 3 |
mr.DUDA воспользовался твоим советом и написал маленькую программку:
Но я снова получаю помимо нужных окон, кучу ненужных (Пробовал под XP). Может я сделал что-то не так? |
|||
|
||||
| Plamenk |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 258 Регистрация: 18.2.2003 Репутация: нет Всего: 3 |
Со стилями тоже пробовал, ничего не получилось. Мне кажется здесь этим не поможешь.
|
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Затрудняюсь что-либо сказать. Еще раз рекомендую взглянуть на
http://www.codeguru.com/system/ListProcesses.shtml -------------------- ![]() |
|||
|
||||
| Unregistered |
|
|||
|
Unregistered |
Смотрел я эту программу, обычное перечисление всех процессов с помощью EnumProcess().
|
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Тогда остается либо пробовать-таки со стилями (посмотри WS_OVERLAPPED, WS_VISIBLE, что-то вроде WS_SYSTEMMENU), или искать, искать, искать... (мот даже, есть стандартный COM-компонент с подходящими ф-циями)...
-------------------- ![]() |
|||
|
||||
| Plamenk |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 258 Регистрация: 18.2.2003 Репутация: нет Всего: 3 |
Ладно всем спасибо за участие!
|
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Ну, ты что, так и не придумал ничего. Я вот подумал может так:
sz... - это указатели на отведённые в памяти места для имени окна, класса и того, что в список добавим hListBox - это окно класса LISTBOX. Короче, фишка в том, чтоб отсеить невидимые окна и окна имеющие родителей (владельцев - OWNER). Есть правда проблема. Попадают окно класса Shell_TrayWnd без заголовка и окно класса Progman с заголовком Program Manager. Их можно было бы отсеивать по имени класса, но где гарантии, что так будет во всех ОС (у меня XP). |
|||
|
||||
| Plamenk |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 258 Регистрация: 18.2.2003 Репутация: нет Всего: 3 |
RAN, Спасибо тебе, всё получилось. Только надо добавить проверку на то, чтобы заголовок окна не равнялся "".
|
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
А как же Program Manager?
|
|||
|
||||
| Plamenk |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 258 Регистрация: 18.2.2003 Репутация: нет Всего: 3 |
Его тоже фильтровать либо по заголовку или по названию класса.
По-моему, это какое-то стандартное Windows'ое окно. Я проверил в Win98 есть такое же. Кстати заметил странную вещь, если в WinXP заголовок окна "", то в списке приложений, по нажатию Alt+Ctr+Del, приложение не выводится. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |