Russian Qt Forum
Ноябрь 25, 2024, 00:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Получить список активных окон  (Прочитано 7757 раз)
virtual_root
Гость
« : Июль 06, 2012, 16:46 »

Ребята, мне нужно получить список всех активных окон в windows с названиями приложений к которым они относятся. Список окон я получила, а вот как узнать название приложения не могу найти...
Код:
 QMap<QString,QVariant> window;
    HWND windowHandle;
    char title[255];
    windowHandle = GetForegroundWindow();
    while (windowHandle!=0){
        GetWindowText(windowHandle,title,255);
        window["title"] = (QString)title;
        window["flagActivity"] = IsWindowEnabled(windowHandle);  // имеет ли окно фокус ввода
        windowHandle=GetWindow(windowHandle,GW_HWNDnext); //следующее окно
    }
В приведенном коде я получаю список окон и проверяю флаг их активности, фокус. Подскажите, пожалуйста, как мне получить название приложения зная дескриптор окна?Непонимающий
« Последнее редактирование: Июль 06, 2012, 16:48 от virtual_root » Записан
mutineer
Гость
« Ответ #1 : Июль 06, 2012, 16:50 »

"Название приложения" - это что такое? Имя бинарника? Заголовок окна?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #2 : Июль 06, 2012, 16:57 »

видимо название бинарника, т.к. заголовок окна уже получен в коде (GetWindowText()). наверное надо через список процессов это делать.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
virtual_root
Гость
« Ответ #3 : Июль 06, 2012, 17:00 »

Да мне нужно имя бинарника. Появилась идея получать список всех приложений из диспетчера задач. В диспетчере задач отображается и название программы и её заголовок. Можно ли эти данные получить по отдельности зная PID процесса? Или как бы можно было достать оттуда эту инф-ю?
Записан
virtual_root
Гость
« Ответ #4 : Июль 06, 2012, 17:01 »

Я смотрела фун-и по работе с процессами. Но я могу лишь получить PID процесса, а как же мне узнать заголовок окна к которому он привязан?
Записан
virtual_root
Гость
« Ответ #5 : Июль 06, 2012, 18:12 »

Написала фун-ю которая получает список всех процессов, затем пытаюсь получить id основного потока в каждом процессе, они мне нужны для фун-и EnumThreadWindows которая вернет дескриптор окна потока, а я из него заголовок получу. Но вот беда ID потока приходит у всех одинаковый... Почему?
    
Код:
PROCESSENTRY32 PE32;
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if(hSnapshot == INVALID_HANDLE_VALUE)
    {
       qDebug()<<"CreateToolhelp32Snapshot() failed.";
      return;
    }

    PE32.dwSize = sizeof(PROCESSENTRY32);

    if(!Process32First(hSnapshot, &PE32))
    {
      CloseHandle(hSnapshot);
      qDebug()<<"Process32First() failed.";
      return;
    }

    do {

        qDebug()<< PE32.th32ProcessID << QString::fromWCharArray(PE32.szExeFile);
       // GetWindowThreadProcessId(GetForegroundWindow(),)
        qDebug()<< GetThreadId(hSnapshot);
        THREADENTRY32 te32;
        te32.dwSize = sizeof(THREADENTRY32);
         if (Thread32First(hSnapshot, &te32))
          {
            qDebug() << te32.th32ThreadID << "! " << te32.th32OwnerProcessID << endl;
            while (Thread32Next(hSnapshot, &te32))
            qDebug() << te32.th32ThreadID << " !" << te32.th32OwnerProcessID << endl;
          }
         else qDebug()<<"!"<<te32.th32ThreadID;

    }
    while(Process32Next(hSnapshot, &PE32));

    CloseHandle(hSnapshot);
« Последнее редактирование: Июль 06, 2012, 18:16 от virtual_root » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #6 : Июль 06, 2012, 18:33 »

Откуда вы вообще такие примеры берёте? Сперва WTS, теперь снапшоты. Постарайтесь понять что вы используете перед тем как использовать.

Ваше решение - EnumWindows, GetWindowThreadProcessId, GetProcessImageFileName
« Последнее редактирование: Июль 06, 2012, 18:36 от Alex Custov » Записан
Serr500
Гость
« Ответ #7 : Июль 06, 2012, 19:22 »

 Шокированный Вы вообще документацию к функции CreateToolhelp32Snapshot читали?
Цитировать
Takes a snapshot of the specified processes, as well as the heaps, modules, and threads used by these processes.
Зачем это??
Alex Custov дал Вам верный список функций.
Записан
Bepec
Гость
« Ответ #8 : Июль 06, 2012, 19:42 »

Походу мы наблюдаем будущего вирусописателя чоли Улыбающийся

Слишком уж набор специфичный - глобальный хук, вычисление всех окон, сокрытие хука от антивируса, ловля лока учётки Веселый
Записан
virtual_root
Гость
« Ответ #9 : Июль 09, 2012, 14:24 »

Спасибо ребята! Воспользовалась приведённым набором функций и у меня всё получилось! Моему счастью не было предела)
Но у меня правда ещё есть вопросики: а кто-нибудь знает какие API функции надо использовать под ос mac os чтобы получить всё тот же список активных окон? Я лазила по интернету, но что-то ничего путёвого не могу найти.. Может кто ссылку кинет.
и один вопрос двоичника: а как мне в использовать статическое свойство класса в не статическом методе? Я в заголовочном файле создала переменную static bool m_flagVisible;
а в не статическом методе пытаюсь к ней обратиться:
Код:
QList<QMap<QString,QVariant> > WinAPIWindows::GetListActivityWindow(bool visible){
     WinAPIWindows::s_instance->m_flagVisible = visible;
    // активные окна
    EnumWindows(EnumWindowsProc,NULL);
    QList<QMap<QString,QVariant> > map;
    return map;
}
но компилятор всё время ругается: ошибка: undefined reference to `WinAPIWindows::m_flagVisible'
Я уже как только не пробовала обращаться к ней всё равно одна и таже ошибка... Что я не так делаю?
Записан
virtual_root
Гость
« Ответ #10 : Июль 09, 2012, 14:26 »

Забыла сказать класс синглетон и  WinAPIWindows::s_instance-> приватный указатель на класс.
Записан
Serr500
Гость
« Ответ #11 : Июль 09, 2012, 16:16 »

В .cpp-файле, вероятно, нет следующего:
Код:
bool WinAPIWindows::m_flagVisible = что-то-там;
А обращаться к ней из методов класса можно очень просто:
Код:
m_flagVisible = что-то-там;

P.S. По Макоси ничего не подскажу. Только Windows и, немного, Linux.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.1 секунд. Запросов: 23.