В погоне за URL или "ловим" URL и заголовок активных вкладок в браузерах
19.12.2014, 16:24. Показов 802. Ответов 2
Здравствуйте, уважаемые обитатели форума.
Каюсь, на форум захожу только за советом от бывалых (от самого просто толку мало пока).
Заинтерисовался я интересной программой, которая должна считывать и записывать в файл 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
|