Russian Qt Forum

Qt => Вопросы новичков => Тема начата: virtual_root от Июль 06, 2012, 16:46



Название: Получить список активных окон
Отправлено: 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); //следующее окно
    }
В приведенном коде я получаю список окон и проверяю флаг их активности, фокус. Подскажите, пожалуйста, как мне получить название приложения зная дескриптор окна????


Название: Re: Получить список активных окон
Отправлено: mutineer от Июль 06, 2012, 16:50
"Название приложения" - это что такое? Имя бинарника? Заголовок окна?


Название: Re: Получить список активных окон
Отправлено: kambala от Июль 06, 2012, 16:57
видимо название бинарника, т.к. заголовок окна уже получен в коде (GetWindowText()). наверное надо через список процессов это делать.


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


Название: Re: Получить список активных окон
Отправлено: virtual_root от Июль 06, 2012, 17:01
Я смотрела фун-и по работе с процессами. Но я могу лишь получить PID процесса, а как же мне узнать заголовок окна к которому он привязан?


Название: Re: Получить список активных окон
Отправлено: virtual_root от Июль 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);


Название: Re: Получить список активных окон
Отправлено: Alex Custov от Июль 06, 2012, 18:33
Откуда вы вообще такие примеры берёте? Сперва WTS, теперь снапшоты. Постарайтесь понять что вы используете перед тем как использовать.

Ваше решение - EnumWindows, GetWindowThreadProcessId, GetProcessImageFileName


Название: Re: Получить список активных окон
Отправлено: Serr500 от Июль 06, 2012, 19:22
 :o Вы вообще документацию к функции CreateToolhelp32Snapshot читали?
Цитировать
Takes a snapshot of the specified processes, as well as the heaps, modules, and threads used by these processes.
Зачем это??
Alex Custov дал Вам верный список функций.


Название: Re: Получить список активных окон
Отправлено: Bepec от Июль 06, 2012, 19:42
Походу мы наблюдаем будущего вирусописателя чоли :)

Слишком уж набор специфичный - глобальный хук, вычисление всех окон, сокрытие хука от антивируса, ловля лока учётки :D


Название: Re: Получить список активных окон
Отправлено: virtual_root от Июль 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'
Я уже как только не пробовала обращаться к ней всё равно одна и таже ошибка... Что я не так делаю?


Название: Re: Получить список активных окон
Отправлено: virtual_root от Июль 09, 2012, 14:26
Забыла сказать класс синглетон и  WinAPIWindows::s_instance-> приватный указатель на класс.


Название: Re: Получить список активных окон
Отправлено: Serr500 от Июль 09, 2012, 16:16
В .cpp-файле, вероятно, нет следующего:
Код:
bool WinAPIWindows::m_flagVisible = что-то-там;
А обращаться к ней из методов класса можно очень просто:
Код:
m_flagVisible = что-то-там;

P.S. По Макоси ничего не подскажу. Только Windows и, немного, Linux.