Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 31.10.2013
Сообщений: 40
1

В погоне за URL или "ловим" URL и заголовок активных вкладок в браузерах

19.12.2014, 16:24. Показов 802. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, уважаемые обитатели форума.

Каюсь, на форум захожу только за советом от бывалых (от самого просто толку мало пока).

Заинтерисовался я интересной программой, которая должна считывать и записывать в файл URL и заголовок активных вкладок в браузерах (Chrome,Firefox,IE,Opera). Однако, не могу понять, как это реализовать.

Нашел очень похожее решение:
Источник

По-сути, это и есть то, что мне нужно, НО программа реализована при помощи QT фреймворка, а я хочу сделать все на обычном С++. В основном проблема состоит в том, что я не могу найти аналоги QT-ных классов в VS12 и не могу собрать все во едино. (код - ниже)

Собственно, сами вопросы:

1) Имеються ли аналоги QT-ных классов в VS12 ?
2) Может кто-либо помочь сделать из кода с использованием QT обычный С++, что бы на рабочей программе я мог разбираться в принципе действия (заменил-запустил-увидел).

Буду очень признателен за любую помощь. Заранее спасибо!

Код:
1) Опера
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
QString GetUrlByTitle(const QString& strPathToData,
    const QString& strTitle)
{
    QString strTitleCopy = strTitle;
    strTitleCopy.replace(" - Opera", "");
 
    QString strPathToHistory = strPathToData + "/global_history.dat";
    QFile File(strPathToHistory);
    if(!File.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        return QString();
    }
 
    int TitleSize = strTitleCopy.count();
    QTextStream Stream(&File);
    Stream.setCodec("UTF-8");
    const int OperLineLimit = 125;
 
    if (strTitleCopy.endsWith("...") && TitleSize > OperLineLimit)
    {
        //Отрезаем многоточие
        strTitleCopy.chop(3);
        while(!Stream.atEnd())
        {
            QString strLine = Stream.readLine();
            if(strLine.count() > OperLineLimit &&
                strLine.startsWith(strTitleCopy))
            {
                strLine = Stream.readLine();
                return strLine;
            }
        }
    }
    else
    {
        while(!Stream.atEnd())
        {
            QString strLine = Stream.readLine();
            if(strLine == strTitleCopy)
            {
                strLine = Stream.readLine();
                return strLine;
            }
        }
    }
    return QString();
}
2) Мозила
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
enum Versions{e30, e35};
Versions DetermineFirefoxVersion(const QString& strPathToData)
{
    QString strCompatabilityPath = strPathToData;
    strCompatabilityPath += "/compatibility.ini";
    QFile File(strCompatabilityPath);
    if (File.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        QTextStream Stream(&File);
        Stream.setCodec("UTF-8");
        QString strLine = Stream.readAll();
        if (strLine.indexOf("LastVersion=3.0") != -1)
            return e30;
    }
    return e35;
}
 
void ReplaceUnicodeCodesWithCharacters(QString& strSource)
{
    QRegExp RegExp("\\u([0-9A-F]{4})");
    QStringList List;
    int CodePosition = 0;
    while((CodePosition = RegExp.indexIn(strSource, CodePosition)) != -1)
    {
        if (!List.contains(RegExp.cap(1)))
            List << RegExp.cap(1);
        CodePosition += RegExp.matchedLength();
    }
 
    foreach(QString strEntry, List)
    {
        bool Ok = false;
        uint CodePoint = strEntry.toUInt(&Ok, 16);
        if(Ok)
        {
            QString strTmp = QChar(CodePoint);
            strSource.replace("\\u" + strEntry, strTmp);
        }
        else
        {
            //Уупс, что-то не то у нас в строке
        }
    }
    strSource.replace("\\xAB", "«");
    strSource.replace("\\xBB", "»");
    strSource.replace("\\xA0", " ");
}
 
QString GetUrlByTitle(const QString& strTitle,
    const QString& strPathToData)
{
    QString strWindowTitle = strTitle;
    strWindowTitle.replace(" - Mozilla Firefox", "");
    strWindowTitle.replace("\"", "\\\"");
    //Воссоздаем формат принятый в sessionstore.js из нашего заголовка
    QString strTitleEntry = "\"title\":\"" + strWindowTitle + "\"";
 
    QString strPathToStore = strPathToData + "/sessionstore.js";
    QFile File(strPathToStore);
    if (!File.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        return QString();
    }
    QTextStream Stream(&File);
    Stream.setCodec("UTF-8");
    QString strContent = Stream.readAll();
 
    Versions Version = DetermineFirefoxVersion();
    if (Version == e30)
    {
        strTitleEntry = " title:\"" + strWindowTitle + "\"";
        ReplaceUnicodeCodesWithCharacters(strContent);
    }
    QRegExp RegExp("\"url\":\"([^{]*)\"," + strTitleEntry);
    RegExp.setMinimal(true);
    if(RegExp.indexIn(strContent) != -1)
        return RegExp.cap(1).trimmed();
 
    /*
         Если не удалось найти посредством RegExp,
         будем искать "по старинке"
    */
    int TitlePosition = strContent.indexOf(strTitleEntry);
    if (TitlePosition != -1)
    {
        QString strUrlPattern = "\"url\":\"";
        //'"'(кавычка) и ','(запятая)
        int RedundantSymbols = 2;
        if (Version == e30)
        {
            strUrlPattern = "url:\"";
            //Учитываем дополнительный пробел
            RedundantSymbols++;
        }
        QString strLeftPart = strContent.left(TitlePosition);
 
        int UrlPosition = strLeftPart.lastIndexOf(strUrlPattern);
        int UrlSize = TitlePosition - UrlPosition - RedundantSymbols;
        QString strResult;
        if(UrlSize > 0)
            strResult = strLeftPart.mid(UrlPosition + strUrlPattern.size(),
                UrlSize);
        return strResult;
    }
    return QString();
}
3) Експлорер
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
QString GetWindowText(HWND Window)
{
    int Length = ::SendMessage(Window, WM_GETTEXTLENGTH, 0, 0);
    if (Length == 0)
        return QString();
    //для \0 символа
    Length += 1;
    QScopedArrayPointer<WCHAR> spBuffer(new WCHAR[Length]);
    ::SendMessage(Window, WM_GETTEXT, Length,
        reinterpret_cast<LPARAM>(spBuffer.data()));
    return QString::fromWCharArray(spBuffer.data());
}
 
 
HWND ActiveWindow = ::GetForegroundWindow();
HWND WorkerHandle = ::FindWindowEx(ActiveWindow, NULL, L"WorkerW", NULL);
if(!WorkerHandle)
    WorkerHandle = ::FindWindowEx(m_ActiveWindow, NULL, L"WorkerA", NULL);
if(!WorkerHandle)
{
    return QString();
}
HWND RebarHandle = ::FindWindowEx(WorkerHandle, NULL, L"ReBarWindow32",
    NULL);     
HWND ComboBoxExHandle = ::FindWindowEx(RebarHandle, NULL, L"ComboBoxEx32",
    NULL);
 
HWND AdressBandRootHandle = NULL;
if(!ComboBoxExHandle)
{
    AdressBandRootHandle = ::FindWindowEx(RebarHandle, NULL,
        L"Address Band Root", NULL);
}
HWND ComboBoxHandle = NULL;
if(ComboBoxExHandle)
        ComboBoxHandle = ::FindWindowEx(ComboBoxExHandle, NULL,
            L"ComboBox", NULL);
 
HWND EditHandle = NULL;
//IE 7.0 и выше...
if (!ComboBoxHandle)
{
    EditHandle = ::FindWindowEx(AdressBandRootHandle, NULL, L"Edit",
        NULL);
}
//...или IE 6.0
else
{
    EditHandle = ::FindWindowEx(ComboBoxHandle, NULL, L"Edit", NULL);
}
return GetWindowText(EditHandle);
4) Хром
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
int FindTitleIndex(const QByteArray& FileContent,
    const QString& strTitle,
    int StartPosition/* = 0*/)
{
    QTextCodec* pCodec = QTextCodec::codecForName("UTF-16LE");
    QByteArray Utf16Title = pCodec->fromUnicode(strTitle);
    //Удаляем BOM(специфично для Qt)
    Utf16Title.remove(0, 2);
    int TitleIndex = FileContent.indexOf(Utf16Title, StartPosition);
    /*
        Определяем, является ли найденная позиция искомой, или
        это позиция подстроки другого заголовка.
    */
    if (TitleIndex != -1)
    {
        QByteArray TruncatedContent = FileContent.left(TitleIndex);
        int UrlStart = TruncatedContent.lastIndexOf("http");
        if (UrlStart != -1)
        {
            QByteArray LengthBytes;
            if (strTitle.size()/256)
            {
                unsigned short TitleSize =strTitle.size();
                char *pTitleSize = reinterpret_cast<char*>(&TitleSize);
                LengthBytes = QByteArray(pTitleSize, sizeof(TitleSize));
            }
            else
            {
                char TitleSize = static_cast<char>(strTitle.size());
                LengthBytes = QByteArray(&TitleSize, sizeof(char));
            }
            /*
                 Ищем байты представляющие длину заголовка между
                 заголовком и url. Продолжаем поиск заголовка если эти
                 байты не найдены
            */
            if (TruncatedContent.indexOf(LengthBytes, UrlStart) == -1)
                return FindTitleIndex(FileContent,
                    strTitle, TitleIndex + strTitle.size());
        }
    }
    return TitleIndex;
}
 
QString GetUrlByTitle(const QString& strTitle,
    const QString& strPathToData)
{
    QString strTitleCopy = strTitle;
    strTitleCopy.replace(" - Google Chrome", "");
 
    QString strPathToHistory = strPathToData + "/Current Session";
    QFile File(strPathToHistory);
    if (!File.open(QIODevice::ReadOnly))
    {
        return QString();
    }
    QByteArray FileContent = File.readAll();
 
    int TitleStart = FindTitleIndex(FileContent, strTitleCopy);
    if (TitleStart != -1)
    {
        QByteArray TruncatedContent = FileContent.left(TitleStart);
        int UrlStart = TruncatedContent.lastIndexOf("http");
        TruncatedContent.remove(0, UrlStart);
        TruncatedContent.replace('\0', "");
        int LengthBytes = strTitleCopy.size()/256 + 1;
        TruncatedContent.chop(LengthBytes);
        return TruncatedContent;
    }
    else
    {
        //Заголовок не найден, увы
    }
    return QString();
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.12.2014, 16:24
Ответы с готовыми решениями:

Узнать url вкладок, запущенных в браузерах
Что бы узнать url активной вкладки, нужно использовать этот код var roots =...

Как спуститься на url уровнем ниже, или перейти из url одного приложения в url другого?
Допустим есть приложение cat и приложение dog. В корневом urls.py прописанно: from django.contrib...

Открыть URL (там ссылка, которая совершает переход на другой URL) и вытянуть новый URL
Стоит задача по одному URL получить другой Пробовал открывать URL через webbrowser, но это не...

Кликая по label с емайлом, нужно открыть почтовый клиент, или загрузить url, если label содержит url
Кликая по label с емайлом, нужно открыть почтовый клиент, или загрузить url, если label содержит url

2
0 / 0 / 0
Регистрация: 31.10.2013
Сообщений: 40
19.12.2014, 16:25  [ТС] 2
Получаем заголовок активной вкладки
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
HWND ActiveWindow = ::GetForegroundWindow();
while(!ActiveWindow)
{
    ActiveWindow = ::GetForegroundWindow();
}
int Length = ::SendMessage(Window, WM_GETTEXTLENGTH, 0, 0);
//для \0 символа
Length += 1;
std::vector<wchar_t> Buffer(Length);
::SendMessage(Window, WM_GETTEXT, Length,
    reinterpret_cast<LPARAM>(&Buffer[0]));
0
0 / 0 / 0
Регистрация: 31.10.2013
Сообщений: 40
20.12.2014, 17:11  [ТС] 3
Я уже несколько продвинулся, но по-прежнему не помешает помощь.
0
20.12.2014, 17:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.12.2014, 17:11
Помогаю со студенческими работами здесь

Получение URL всех вкладок стороннего браузера
Всем доброго времени суток! В теме &quot;Visual Basic .NET FAQ&quot; есть решение &quot;Получение URL всех...

Вывести заголовок url браузера в html файл
Всем привет: Из браузера вытаскиваю информацию по какой ссылке лазиет пользователь. Хочу это...

как получить заголовок сторонней страницы по url?
Есть такой способ: function page_title($url) { $fp = file_get_contents($url); ...

Реклама в браузерах и заражение URL:Mal
Здравствуйте! Прошу помощи- стали выскакивать рекламные вкладки в браузерах, при нажатии ссылок. ...

Сколько можно добавить URL адресов в свою созданную Группу URl?
Добрый день. Подскажите пожалуйста, сколько можно добавить URL адресов в свою созданную Группу...

Почему такая ошибка? net/url: invalid control character in URL
Здравствуйте, при http запросе выдает такую ошибку: : net/url: invalid control character in URL....

Как исправить: Изменил URL, но в адресных строках отображаются станые URL
Раньше были такого вида http://selftrips.ru/2013/01/07/27269 переделал на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru