forked from Public-Mirror/Textractor
fix style issues and use blank icons
This commit is contained in:
parent
a1d3abb080
commit
eb1421c143
@ -2,20 +2,15 @@ include(QtUtils)
|
||||
msvc_registry_search()
|
||||
find_qt5(Core Widgets WinExtras)
|
||||
|
||||
set(CMAKE_AUTOUIC ON)
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(CMAKE_AUTORCC ON)
|
||||
|
||||
add_executable(Textractor WIN32
|
||||
main.cpp
|
||||
mainwindow.cpp
|
||||
extenwindow.cpp
|
||||
attachtoprocessdialog.cpp
|
||||
attachprocessdialog.cpp
|
||||
host/exception.cpp
|
||||
host/host.cpp
|
||||
host/textthread.cpp
|
||||
host/hookcode.cpp
|
||||
utils/windowshelpers.cpp
|
||||
Textractor.rc
|
||||
Textractor.ico
|
||||
)
|
||||
|
48
GUI/attachprocessdialog.cpp
Normal file
48
GUI/attachprocessdialog.cpp
Normal file
@ -0,0 +1,48 @@
|
||||
#include "attachprocessdialog.h"
|
||||
#include <QtWinExtras/QtWin>
|
||||
|
||||
extern const char* SELECT_PROCESS;
|
||||
extern const char* ATTACH_INFO;
|
||||
|
||||
AttachProcessDialog::AttachProcessDialog(QWidget *parent, std::vector<std::pair<QString, HICON>> processIcons) :
|
||||
QDialog(parent, Qt::WindowCloseButtonHint),
|
||||
model(this)
|
||||
{
|
||||
ui.setupUi(this);
|
||||
setWindowTitle(SELECT_PROCESS);
|
||||
ui.label->setText(ATTACH_INFO);
|
||||
ui.processIdEdit->setValidator(new QIntValidator(0, INT_MAX, this));
|
||||
ui.processList->setModel(&model);
|
||||
|
||||
QPixmap transparent(100, 100);
|
||||
transparent.fill(QColor::fromRgba(0));
|
||||
for (const auto& [process, icon] : processIcons)
|
||||
{
|
||||
auto item = new QStandardItem(icon ? QIcon(QtWin::fromHICON(icon)) : transparent, process);
|
||||
item->setEditable(false);
|
||||
model.appendRow(item);
|
||||
}
|
||||
|
||||
connect(ui.buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
|
||||
connect(ui.buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
|
||||
connect(ui.processList, &QListView::clicked, [this](QModelIndex index)
|
||||
{
|
||||
selectedProcess = model.item(index.row())->text();
|
||||
});
|
||||
connect(ui.processList, &QListView::doubleClicked, [this](QModelIndex index)
|
||||
{
|
||||
selectedProcess = model.item(index.row())->text();
|
||||
accept();
|
||||
});
|
||||
connect(ui.processIdEdit, &QLineEdit::returnPressed, [this]
|
||||
{
|
||||
selectedProcess = ui.processIdEdit->text();
|
||||
accept();
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
QString AttachProcessDialog::SelectedProcess()
|
||||
{
|
||||
return selectedProcess.isEmpty() ? ui.processIdEdit->text() : selectedProcess;
|
||||
}
|
17
GUI/attachprocessdialog.h
Normal file
17
GUI/attachprocessdialog.h
Normal file
@ -0,0 +1,17 @@
|
||||
#pragma once
|
||||
|
||||
#include "qtcommon.h"
|
||||
#include "ui_attachprocessdialog.h"
|
||||
#include <QStandardItemModel>
|
||||
|
||||
class AttachProcessDialog : public QDialog
|
||||
{
|
||||
public:
|
||||
explicit AttachProcessDialog(QWidget *parent, std::vector<std::pair<QString, HICON>> processIcons);
|
||||
QString SelectedProcess();
|
||||
|
||||
private:
|
||||
Ui::AttachProcessDialog ui;
|
||||
QStandardItemModel model;
|
||||
QString selectedProcess;
|
||||
};
|
41
GUI/attachprocessdialog.ui
Normal file
41
GUI/attachprocessdialog.ui
Normal file
@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>AttachProcessDialog</class>
|
||||
<widget class="QWidget" name="AttachProcessDialog">
|
||||
<property name="windowModality">
|
||||
<enum>Qt::WindowModal</enum>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>800</width>
|
||||
<height>400</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="label"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="processIdEdit">
|
||||
<property name="placeholderText">
|
||||
<string>Process id</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QListView" name="processList"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
@ -1,92 +0,0 @@
|
||||
#include "attachtoprocessdialog.h"
|
||||
#include "ui_attachtoprocessdialog.h"
|
||||
#include "utils/windowshelpers.h"
|
||||
|
||||
#include <QStandardItemModel>
|
||||
#include <algorithm>
|
||||
#include <limits>
|
||||
|
||||
namespace
|
||||
{
|
||||
QString GetNameProcessFromIndex(const QModelIndex &index, const QVector<QPair<QString, HICON>>& data)
|
||||
{
|
||||
const int row = index.row();
|
||||
return data[row].first;
|
||||
}
|
||||
}
|
||||
|
||||
AttachToProcessDialog::AttachToProcessDialog(QWidget *parent) :
|
||||
QDialog(parent, Qt::WindowCloseButtonHint),
|
||||
ui(new Ui::AttachToProcessDialog),
|
||||
model(new QStandardItemModel(this))
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
const QIntValidator* validator = new QIntValidator(0, INT_MAX, this);
|
||||
ui->lineEdit->setValidator(validator);
|
||||
}
|
||||
|
||||
AttachToProcessDialog::~AttachToProcessDialog()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void AttachToProcessDialog::setLabelText(const QString& text)
|
||||
{
|
||||
ui->label->setText(text);
|
||||
}
|
||||
|
||||
void AttachToProcessDialog::setData(QVector<QPair<QString, HICON>>&& newData)
|
||||
{
|
||||
data = std::move(newData);
|
||||
selectedProcess.clear();
|
||||
std::sort(data.begin(), data.end(), [](const auto& left, const auto& right) {
|
||||
return left.first < right.first;
|
||||
});
|
||||
model->clear();
|
||||
for (const auto& [process, hIcon] : data)
|
||||
{
|
||||
QIcon icon = WindowsHepers::CreateQIconFromHIcon(hIcon);
|
||||
auto* item = new QStandardItem(icon, process);
|
||||
item->setEditable(false);
|
||||
model->appendRow(item);
|
||||
}
|
||||
ui->listView->setModel(model);
|
||||
}
|
||||
|
||||
QString AttachToProcessDialog::getSelectedData()
|
||||
{
|
||||
return selectedProcess.isEmpty() ? ui->lineEdit->text() : selectedProcess;
|
||||
}
|
||||
|
||||
void AttachToProcessDialog::on_buttonBox_accepted()
|
||||
{
|
||||
accept();
|
||||
}
|
||||
|
||||
void AttachToProcessDialog::on_buttonBox_rejected()
|
||||
{
|
||||
reject();
|
||||
}
|
||||
|
||||
void AttachToProcessDialog::on_listView_doubleClicked(const QModelIndex& index)
|
||||
{
|
||||
selectedProcess = GetNameProcessFromIndex(index, data);
|
||||
accept();
|
||||
}
|
||||
|
||||
void AttachToProcessDialog::on_lineEdit_returnPressed()
|
||||
{
|
||||
selectedProcess = ui->lineEdit->text();
|
||||
accept();
|
||||
}
|
||||
|
||||
void AttachToProcessDialog::on_listView_clicked(const QModelIndex &index)
|
||||
{
|
||||
selectedProcess = GetNameProcessFromIndex(index, data);
|
||||
}
|
||||
|
||||
void AttachToProcessDialog::on_lineEdit_editingFinished()
|
||||
{
|
||||
selectedProcess = ui->lineEdit->text();
|
||||
}
|
@ -1,51 +0,0 @@
|
||||
#ifndef ATTACHTOPROCESSDIALOG_H
|
||||
#define ATTACHTOPROCESSDIALOG_H
|
||||
|
||||
#include <QDialog>
|
||||
#include <QString>
|
||||
#include <QPair>
|
||||
#include <QStyledItemDelegate>
|
||||
#include <QVector>
|
||||
#include <QtWinExtras/QtWin>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
namespace Ui {
|
||||
class AttachToProcessDialog;
|
||||
}
|
||||
QT_END_NAMESPACE
|
||||
|
||||
class QStandardItemModel;
|
||||
class QModelIndex;
|
||||
|
||||
class AttachToProcessDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit AttachToProcessDialog(QWidget *parent = nullptr);
|
||||
void setData(QVector<QPair<QString, HICON>>&& newData);
|
||||
void setLabelText(const QString& text);
|
||||
QString getSelectedData();
|
||||
~AttachToProcessDialog();
|
||||
|
||||
private slots:
|
||||
void on_buttonBox_accepted();
|
||||
|
||||
void on_buttonBox_rejected();
|
||||
|
||||
void on_listView_doubleClicked(const QModelIndex &index);
|
||||
|
||||
void on_lineEdit_returnPressed();
|
||||
|
||||
void on_listView_clicked(const QModelIndex &index);
|
||||
|
||||
void on_lineEdit_editingFinished();
|
||||
|
||||
private:
|
||||
Ui::AttachToProcessDialog* ui;
|
||||
QStandardItemModel* model;
|
||||
QString selectedProcess;
|
||||
QVector<QPair<QString, HICON>> data;
|
||||
};
|
||||
|
||||
#endif // ATTACHTOPROCESSDIALOG_H
|
@ -1,52 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>AttachToProcessDialog</class>
|
||||
<widget class="QWidget" name="AttachToProcessDialog">
|
||||
<property name="windowModality">
|
||||
<enum>Qt::WindowModal</enum>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>813</width>
|
||||
<height>426</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>TextLabel</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="lineEdit">
|
||||
<property name="placeholderText">
|
||||
<string>PID</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QListView" name="listView"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
@ -2,11 +2,6 @@
|
||||
|
||||
#include "qtcommon.h"
|
||||
|
||||
namespace Ui
|
||||
{
|
||||
class ExtenWindow;
|
||||
}
|
||||
|
||||
struct InfoForExtension
|
||||
{
|
||||
const char* name;
|
||||
|
@ -5,9 +5,7 @@
|
||||
#include "extenwindow.h"
|
||||
#include "host/host.h"
|
||||
#include "host/hookcode.h"
|
||||
#include "attachtoprocessdialog.h"
|
||||
#include "utils/windowshelpers.h"
|
||||
|
||||
#include "attachprocessdialog.h"
|
||||
#include <shellapi.h>
|
||||
#include <process.h>
|
||||
#include <QRegularExpression>
|
||||
@ -32,7 +30,6 @@ extern const char* SETTINGS;
|
||||
extern const char* EXTENSIONS;
|
||||
extern const char* FONT;
|
||||
extern const char* SELECT_PROCESS;
|
||||
extern const char* ATTACH_INFO;
|
||||
extern const char* SELECT_PROCESS_INFO;
|
||||
extern const char* FROM_COMPUTER;
|
||||
extern const char* PROCESSES;
|
||||
@ -83,7 +80,6 @@ namespace
|
||||
Ui::MainWindow ui;
|
||||
std::atomic<DWORD> selectedProcessId = 0;
|
||||
ExtenWindow* extenWindow = nullptr;
|
||||
AttachToProcessDialog* attachDialog = nullptr;
|
||||
std::unordered_set<DWORD> alreadyAttached;
|
||||
bool autoAttach = false, autoAttachSavedOnly = true;
|
||||
bool showSystemProcesses = false;
|
||||
@ -157,50 +153,31 @@ namespace
|
||||
}
|
||||
|
||||
void AttachProcess()
|
||||
{
|
||||
auto processes = GetAllProcesses();
|
||||
{
|
||||
QMultiHash<QString, DWORD> processesMap;
|
||||
QVector<QPair<QString, HICON>> dialogData;
|
||||
dialogData.reserve(processes.size());
|
||||
for (auto [processId, processName] : processes)
|
||||
std::vector<std::pair<QString, HICON>> processIcons;
|
||||
for (auto [processId, processName] : GetAllProcesses())
|
||||
{
|
||||
if (processName && (showSystemProcesses || processName->find(L":\\Windows\\") == std::string::npos))
|
||||
{
|
||||
const auto& value = processName.value();
|
||||
const QFileInfo& fileInfo = QFileInfo(S(value));
|
||||
const QString& fileName = fileInfo.fileName();
|
||||
QString fileName = QFileInfo(S(processName.value())).fileName();
|
||||
if (!processesMap.contains(fileName))
|
||||
{
|
||||
const auto icon = WindowsHepers::GetIconHandlerFromExe(value.c_str());
|
||||
dialogData.push_back({fileName, icon});
|
||||
HICON bigIcon, smallIcon;
|
||||
ExtractIconExW(processName->c_str(), 0, &bigIcon, &smallIcon, 1);
|
||||
processIcons.push_back({ fileName, bigIcon ? bigIcon : smallIcon });
|
||||
}
|
||||
processesMap.insert(fileName, processId);
|
||||
}
|
||||
}
|
||||
dialogData.shrink_to_fit();
|
||||
processes.clear();
|
||||
std::sort(processIcons.begin(), processIcons.end());
|
||||
|
||||
attachDialog->setWindowTitle(SELECT_PROCESS);
|
||||
attachDialog->setLabelText(ATTACH_INFO);
|
||||
|
||||
attachDialog->setData(std::move(dialogData));
|
||||
const bool hasChosenData = attachDialog->exec() != 0;
|
||||
|
||||
if (hasChosenData)
|
||||
AttachProcessDialog attachProcessDialog(This, processIcons);
|
||||
if (attachProcessDialog.exec())
|
||||
{
|
||||
const QString& process = attachDialog->getSelectedData();
|
||||
const int pid = process.toInt(nullptr, 0);
|
||||
if (pid)
|
||||
{
|
||||
Host::InjectProcess(pid);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (const auto& processId : processesMap.values(process))
|
||||
{
|
||||
Host::InjectProcess(processId);
|
||||
}
|
||||
}
|
||||
QString process = attachProcessDialog.SelectedProcess();
|
||||
if (int processId = process.toInt(nullptr, 0)) Host::InjectProcess(processId);
|
||||
else for (int processId : processesMap.values(process)) Host::InjectProcess(processId);
|
||||
}
|
||||
}
|
||||
|
||||
@ -636,7 +613,6 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
|
||||
This = this;
|
||||
ui.setupUi(this);
|
||||
extenWindow = new ExtenWindow(this);
|
||||
attachDialog = new AttachToProcessDialog(this);
|
||||
for (auto [text, slot] : Array<const char*, void(&)()>{
|
||||
{ ATTACH, AttachProcess },
|
||||
{ LAUNCH, LaunchProcess },
|
||||
|
@ -1,30 +0,0 @@
|
||||
#include "windowshelpers.h"
|
||||
|
||||
#include <QApplication>
|
||||
#include <QIcon>
|
||||
#include <QStyle>
|
||||
#include <QPixmap>
|
||||
#include <QtWinExtras/QtWin>
|
||||
|
||||
#include <shellapi.h>
|
||||
|
||||
namespace WindowsHepers {
|
||||
HICON GetIconHandlerFromExe(const wchar_t* const filePath)
|
||||
{
|
||||
HICON bigIcon;
|
||||
HICON smallIcon;
|
||||
ExtractIconEx(filePath, 0, &bigIcon, &smallIcon, 1);
|
||||
return bigIcon != 0 ? bigIcon : smallIcon;
|
||||
}
|
||||
|
||||
QIcon CreateQIconFromHIcon(const HICON hIcon)
|
||||
{
|
||||
if (hIcon)
|
||||
{
|
||||
const QPixmap& pixmap = QtWin::fromHICON(hIcon);
|
||||
return QIcon(pixmap);
|
||||
}
|
||||
const QStyle* style = QApplication::style();
|
||||
return style->standardIcon(QStyle::SP_ComputerIcon);
|
||||
}
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <QtWinExtras/QtWin>
|
||||
class QIcon;
|
||||
namespace WindowsHepers
|
||||
{
|
||||
HICON GetIconHandlerFromExe(const wchar_t* const filePath);
|
||||
QIcon CreateQIconFromHIcon(const HICON hIcon);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user