Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Список приложений 
:(
    Опции темы
Plamenk
Дата 30.7.2003, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: нет
Всего: 3



Как можно получить список всех выполняющихся приложений, т.е. те которые можно переключать с помощью Alt+Tab.

Заранее всем СПАСИБО!
PM MAIL   Вверх
GriKo
Дата 30.7.2003, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 7.6.2003
Где: Израиль

Репутация: нет
Всего: нет



Через WinAPI можно... Функция GetWindow называется, помоему.
PM MAIL ICQ   Вверх
Plamenk
Дата 30.7.2003, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: нет
Всего: 3



Мне нужно получить список не зная ни HWND окна, ни PID процесса, так что GetWindow() не поможет.

Это сообщение отредактировал(а) Plamenk - 30.7.2003, 19:00
PM MAIL   Вверх
mr.DUDA
Дата 30.7.2003, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Перечисляй все окна, находящиеся сразу под корневым (рабочим столом) с помощью EnumWindows() или так:
Код

HWND hWnd=0;
DWORD dwProcessId;
while(hWnd=FindWindowEx(0, hWnd, 0, 0))
{
    GetWindowThreadProcessId(hWnd, &dwProcessId);
    // разные действия - запомнить hWnd и dwProcessId в списке и т.д.
}


Это сообщение отредактировал(а) mr.DUDA - 30.7.2003, 21:30


--------------------
user posted image
PM MAIL WWW   Вверх
RAN
Дата 31.7.2003, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



EnumWindows специально для этого и предназначена.
PM MAIL ICQ   Вверх
mr.DUDA
Дата 31.7.2003, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Да, но придется писать callback-функцию, легче все-таки циклом.

Зы, кстати на один процесс приходится (обычно) 2-10 окон, так что нужно сделать проверку при добавлении в список процессов - есть ли такой. А еще будет туча геморойных системных окошек со своими процессами sad.gif


--------------------
user posted image
PM MAIL WWW   Вверх
RAN
Дата 31.7.2003, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



Цитата
Зы, кстати на один процесс приходится (обычно) 2-10 окон, так что нужно сделать проверку при добавлении в список процессов - есть ли такой. А еще будет туча геморойных системных окошек со своими процессами 

Нормальное приложение не будет все подряд окна с NULL в качестве родительского окна использовать и они в перебор не попадут. Именно по-этому не следует использовать в своих приложениях MessageBox(NULL,......).
А надо ли проверять процессы это пусть хозяин топика сам думает, например, если запустить Word несколько раз, то, нажав Ctrl+Alt+Del, мы увидим кучу приложений Word и один единственный процесс WINWORD.EXE.

Это сообщение отредактировал(а) RAN - 31.7.2003, 12:11
PM MAIL ICQ   Вверх
mr.DUDA
Дата 31.7.2003, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Цитата
Нормальное приложение не будет все подряд окна с NULL в качестве родительского окна использовать и они в перебор не попадут. Именно по-этому не следует использовать в своих приложениях MessageBox(NULL,......).


Как насчет чтобы убедиться:
user posted image

И вообще-то NULL в FindWindowEx означает не дескриптор десктопного окна, а то что искать надо под десктопом. Это корень всех окон. Создавая окно без родителя, ты создаешь его под десктопом.


--------------------
user posted image
PM MAIL WWW   Вверх
RAN
Дата 31.7.2003, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



А я и говорю EnumWindows используйте, она по уровням не скачет, а перебирает только окна высшего уровня, а FindWindowEx все, что ниже указанного.
Цитата
И вообще-то NULL в FindWindowEx означает не дескриптор десктопного окна

именно дескриптор десктопа и есть.
PM MAIL ICQ   Вверх
mr.DUDA
Дата 31.7.2003, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



RAN, зайди в Spy++ и посмотри Handle своего окна Desktop.
На скрине он равен 0x80.
Как и любой другой дескриптор, HWND равный нулю не является дескриптором существующего объекта. Можешь спросить у ASM'еров, они тебе подробно объяснят почему.

Это сообщение отредактировал(а) mr.DUDA - 31.7.2003, 13:10


--------------------
user posted image
PM MAIL WWW   Вверх
Ziga
Дата 31.7.2003, 14:02 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
Дата 31.7.2003, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: нет
Всего: 3



Дело в том, что перечислая окна с помощью EnumWindow() или FindWindow() я нахожу все окна, большинство из которых мне ненужны, а вопрос именно в том, как отфильтровать именно те приложения которые можно переключать с помощью Alt+Tab.

PM MAIL   Вверх
RAN
Дата 31.7.2003, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



mr.DUDA, при чём тут asm. Я прекрасно понимаю, что NULL - это не дескриптор, но указание NULL в функциях API вместо дескриптора окна, указывают функции использовать десктоп. Как может NULL быть дескриптором, если это по сути указатель на структуру с инфой об окне.
PM MAIL ICQ   Вверх
mr.DUDA
Дата 31.7.2003, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



про дескрипторы - в ответ на это
Цитата
Цитата
И вообще-то NULL в FindWindowEx означает не дескриптор десктопного окна

именно дескриптор десктопа и есть.

а про то, как отфильтровать - EnumDesktopWindows перечисляет только
Цитата
all top-level windows on a desktop by passing a handle to each window, in turn, to an application-defined callback function.

Если бы не гемор с тучей левых окон, можно было бы юзать EnumWindows, а так конечно придется вызывать GetProcessWindowStation
/EnumDesktops/EnumDesktopWindows.


--------------------
user posted image
PM MAIL WWW   Вверх
RAN
Дата 31.7.2003, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



mr.DUDA, я имел ввиду, что NULL в качестве первого параметра FindWindowEx не является дескриптором, но означает дескриптор десктопного окна, а можно и указать дескриптор другого окно.

P.S. Простите за флейм, не смог удержаться, каюсь
PM MAIL ICQ   Вверх
mr.DUDA
Дата 31.7.2003, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Plamenk, лови ссылку
http://www.codeguru.com/system/ListProcesses.shtml

Вроде чел очень постарался


--------------------
user posted image
PM MAIL WWW   Вверх
alexht
Дата 1.8.2003, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 1.8.2003

Репутация: нет
Всего: нет



Не знаю про NULL, но чето похожее на макрос HWND_DESKTOPWINDOW стопудово и есть ханд окна стола.

PM MAIL   Вверх
mr.DUDA
Дата 1.8.2003, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Это что ли
Код
HWND GetDesktopWindow(VOID);


Цитата
The GetDesktopWindow function returns a handle to the desktop window. The desktop window covers the entire screen. The desktop window is the area on top of which all icons and other windows are painted.


макроса я не нашел

Это сообщение отредактировал(а) mr.DUDA - 1.8.2003, 14:10


--------------------
user posted image
PM MAIL WWW   Вверх
Step
Дата 1.8.2003, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 5
Всего: 25



Цитата
Дело в том, что перечислая окна с помощью EnumWindow() или FindWindow() я нахожу все окна, большинство из которых мне ненужны, а вопрос именно в том, как отфильтровать именно те приложения которые можно переключать с помощью Alt+Tab.
может я и ошибаюсь, но у окна есть стиль, не помню какой именно, но если его обнулить, то программа проподает из панели АЛТ-ТАБ.
Утверждать, конечно, не берусь, но если это подтвердиться, то вы можете у каждого окна проверять это свойство. Таким образом, можно отфильтровать окна


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
Гость_brb
Дата 1.8.2003, 15:11 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
может я и ошибаюсь, но у окна есть стиль, не помню какой именно, HO если его обнулить , то программа пропAдает из панели АЛТ-ТАБ.
Утверждать,   конечно , не берусь, но если это подтвердиться,   то вы можете у каждого окна проверять это свойство. Tаким образом,   можно отфильтровать окна



Step, o5 2!
  Вверх
Step
Дата 1.8.2003, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 5
Всего: 25



Цитата
o5 2!
что это


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
Unregistered
Дата 1.8.2003, 15:15 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











опять двойка!
  Вверх
Plamenk
Дата 4.8.2003, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: нет
Всего: 3



mr.DUDA воспользовался твоим советом и написал маленькую программку:

Код
#include "stdafx.h"
#include "windows.h"

BOOL CALLBACK EnumWindowsProc(
 HWND hwnd,      // handle to parent window
 LPARAM lParam   // application-defined value
)
{
char* sName = new char[MAX_PATH];
GetWindowText(hwnd,sName,MAX_PATH);
delete[] sName;
return TRUE;
}

BOOL CALLBACK EnumDesktopProc(
 LPTSTR lpszDesktop,  // desktop name
 LPARAM lParam        // user-defined value
)
{
HDESK hDesk =  OpenDesktop(lpszDesktop,DF_ALLOWOTHERACCOUNTHOOK,FALSE,DESKTOP_READOBJECTS);
EnumDesktopWindows(hDesk,&EnumWindowsProc,NULL);
CloseDesktop(hDesk);
return TRUE;
}


int main(int argc, char* argv[])
{
EnumDesktops(GetProcessWindowStation(),&EnumDesktopProc,NULL);
return 0;
}


Но я снова получаю помимо нужных окон, кучу ненужных (Пробовал под XP). Может я сделал что-то не так?
PM MAIL   Вверх
Plamenk
Дата 4.8.2003, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: нет
Всего: 3



Со стилями тоже пробовал, ничего не получилось. Мне кажется здесь этим не поможешь.
PM MAIL   Вверх
mr.DUDA
Дата 4.8.2003, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Затрудняюсь что-либо сказать. Еще раз рекомендую взглянуть на
http://www.codeguru.com/system/ListProcesses.shtml


--------------------
user posted image
PM MAIL WWW   Вверх
Unregistered
Дата 4.8.2003, 18:26 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Смотрел я эту программу, обычное перечисление всех процессов с помощью EnumProcess().

  Вверх
mr.DUDA
Дата 4.8.2003, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Тогда остается либо пробовать-таки со стилями (посмотри WS_OVERLAPPED, WS_VISIBLE, что-то вроде WS_SYSTEMMENU), или искать, искать, искать... (мот даже, есть стандартный COM-компонент с подходящими ф-циями)...
confused.gif


--------------------
user posted image
PM MAIL WWW   Вверх
Plamenk
Дата 5.8.2003, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: нет
Всего: 3



Ладно всем спасибо за участие!
PM MAIL   Вверх
RAN
Дата 5.8.2003, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



Ну, ты что, так и не придумал ничего. Я вот подумал может так:
Код

HWND Wnd = GetWindow(GetDesktopWindow(), GW_CHILD);
while (Wnd) {
   if( IsWindowVisible(Wnd) && GetWindow(Wnd, GW_OWNER) == NULL) {
         GetWindowText( Wnd, szWindowName, 70 );
         GetClassName( Wnd, szClassName, 30 );
         wsprintf( szAddString, "%s - %s", szWindowName, szClassName );
         SendMessage( hListBox, LB_INSERTSTRING, (WPARAM)-1, (LPARAM)(LPTSTR)szAddString );
         }
   Wnd = GetWindow( Wnd, GW_HWNDNEXT );
   }


sz... - это указатели на отведённые в памяти места для имени окна, класса и того, что в список добавим
hListBox - это окно класса LISTBOX.

Короче, фишка в том, чтоб отсеить невидимые окна и окна имеющие родителей (владельцев - OWNER). Есть правда проблема. Попадают окно класса Shell_TrayWnd без заголовка и окно класса Progman с заголовком Program Manager. Их можно было бы отсеивать по имени класса, но где гарантии, что так будет во всех ОС (у меня XP).
PM MAIL ICQ   Вверх
Plamenk
Дата 5.8.2003, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: нет
Всего: 3



RAN, Спасибо тебе, всё получилось. Только надо добавить проверку на то, чтобы заголовок окна не равнялся "".
PM MAIL   Вверх
RAN
Дата 5.8.2003, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



А как же Program Manager?
PM MAIL ICQ   Вверх
Plamenk
Дата 5.8.2003, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: нет
Всего: 3



Его тоже фильтровать либо по заголовку или по названию класса.

По-моему, это какое-то стандартное Windows'ое окно. Я проверил в Win98 есть такое же.

Кстати заметил странную вещь, если в WinXP заголовок окна "", то в списке приложений, по нажатию Alt+Ctr+Del, приложение не выводится.
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.3574 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.