forked from Public-Mirror/Textractor
user selected process forgetting, and other small fixes
This commit is contained in:
parent
c5c115c5da
commit
011a5418e9
@ -13,6 +13,8 @@ extern const char* CONFIRM_EXTENSION_OVERWRITE;
|
|||||||
extern const char* EXTENSION_WRITE_ERROR;
|
extern const char* EXTENSION_WRITE_ERROR;
|
||||||
extern const char* EXTEN_WINDOW_INSTRUCTIONS;
|
extern const char* EXTEN_WINDOW_INSTRUCTIONS;
|
||||||
|
|
||||||
|
constexpr auto DEFAULT_EXTENSIONS = u8"Remove Repeated Characters>Remove Repeated Phrases>Regex Filter>Copy to Clipboard>Bing Translate>Extra Window>Extra Newlines";
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
struct Extension
|
struct Extension
|
||||||
|
@ -31,7 +31,7 @@ void TextThread::Stop()
|
|||||||
timer = NULL;
|
timer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextThread::AddSentence(std::wstring&& sentence)
|
void TextThread::AddSentence(std::wstring sentence)
|
||||||
{
|
{
|
||||||
queuedSentences->emplace_back(std::move(sentence));
|
queuedSentences->emplace_back(std::move(sentence));
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ public:
|
|||||||
|
|
||||||
void Start();
|
void Start();
|
||||||
void Stop();
|
void Stop();
|
||||||
void AddSentence(std::wstring&& sentence);
|
void AddSentence(std::wstring sentence);
|
||||||
void Push(BYTE* data, int length);
|
void Push(BYTE* data, int length);
|
||||||
|
|
||||||
Synchronized<std::wstring> storage;
|
Synchronized<std::wstring> storage;
|
||||||
|
@ -18,7 +18,8 @@ extern const char* SETTINGS;
|
|||||||
extern const char* EXTENSIONS;
|
extern const char* EXTENSIONS;
|
||||||
extern const char* SELECT_PROCESS;
|
extern const char* SELECT_PROCESS;
|
||||||
extern const char* ATTACH_INFO;
|
extern const char* ATTACH_INFO;
|
||||||
extern const char* SEARCH_GAME;
|
extern const char* SELECT_PROCESS_INFO;
|
||||||
|
extern const char* FROM_COMPUTER;
|
||||||
extern const char* PROCESSES;
|
extern const char* PROCESSES;
|
||||||
extern const char* CODE_INFODUMP;
|
extern const char* CODE_INFODUMP;
|
||||||
extern const char* HOOK_SEARCH_UNSTABLE_WARNING;
|
extern const char* HOOK_SEARCH_UNSTABLE_WARNING;
|
||||||
@ -53,7 +54,7 @@ MainWindow::MainWindow(QWidget *parent) :
|
|||||||
extenWindow(new ExtenWindow(this))
|
extenWindow(new ExtenWindow(this))
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
for (auto [text, slot] : Array<std::tuple<QString, void(MainWindow::*)()>>{
|
for (auto [text, slot] : Array<std::tuple<const char*, void(MainWindow::*)()>>{
|
||||||
{ ATTACH, &MainWindow::AttachProcess },
|
{ ATTACH, &MainWindow::AttachProcess },
|
||||||
{ LAUNCH, &MainWindow::LaunchProcess },
|
{ LAUNCH, &MainWindow::LaunchProcess },
|
||||||
{ DETACH, &MainWindow::DetachProcess },
|
{ DETACH, &MainWindow::DetachProcess },
|
||||||
@ -66,9 +67,8 @@ MainWindow::MainWindow(QWidget *parent) :
|
|||||||
{ EXTENSIONS, &MainWindow::Extensions }
|
{ EXTENSIONS, &MainWindow::Extensions }
|
||||||
})
|
})
|
||||||
{
|
{
|
||||||
auto button = new QPushButton(ui->processFrame);
|
auto button = new QPushButton(text, ui->processFrame);
|
||||||
connect(button, &QPushButton::clicked, this, slot);
|
connect(button, &QPushButton::clicked, this, slot);
|
||||||
button->setText(text);
|
|
||||||
ui->processLayout->addWidget(button);
|
ui->processLayout->addWidget(button);
|
||||||
}
|
}
|
||||||
ui->processLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding));
|
ui->processLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding));
|
||||||
@ -154,7 +154,6 @@ void MainWindow::ProcessConnected(DWORD processId)
|
|||||||
QTextFile(GAME_SAVE_FILE, QIODevice::WriteOnly | QIODevice::Append).write((process + "\n").toUtf8());
|
QTextFile(GAME_SAVE_FILE, QIODevice::WriteOnly | QIODevice::Append).write((process + "\n").toUtf8());
|
||||||
|
|
||||||
QStringList allProcesses = QString(QTextFile(HOOK_SAVE_FILE, QIODevice::ReadOnly).readAll()).split("\n", QString::SkipEmptyParts);
|
QStringList allProcesses = QString(QTextFile(HOOK_SAVE_FILE, QIODevice::ReadOnly).readAll()).split("\n", QString::SkipEmptyParts);
|
||||||
// Can't use QFileInfo::absoluteFilePath since hook save file has '\\' as path separator
|
|
||||||
auto hookList = std::find_if(allProcesses.rbegin(), allProcesses.rend(), [&](QString hookList) { return hookList.contains(process); });
|
auto hookList = std::find_if(allProcesses.rbegin(), allProcesses.rend(), [&](QString hookList) { return hookList.contains(process); });
|
||||||
if (hookList != allProcesses.rend())
|
if (hookList != allProcesses.rend())
|
||||||
for (auto hookInfo : hookList->split(" , "))
|
for (auto hookInfo : hookList->split(" , "))
|
||||||
@ -173,7 +172,7 @@ void MainWindow::ProcessDisconnected(DWORD processId)
|
|||||||
void MainWindow::ThreadAdded(TextThread& thread)
|
void MainWindow::ThreadAdded(TextThread& thread)
|
||||||
{
|
{
|
||||||
std::wstring threadCode = Util::GenerateCode(thread.hp, thread.tp.processId);
|
std::wstring threadCode = Util::GenerateCode(thread.hp, thread.tp.processId);
|
||||||
QString ttString = TextThreadString(thread) + S(thread.name) + " (" + S(threadCode) + ")";
|
QString ttString = TextThreadString(thread) + S(FormatString(L"(%s)", threadCode));
|
||||||
bool savedMatch = savedThreadCtx == thread.tp.ctx && savedThreadCtx2 == thread.tp.ctx2 && savedThreadCode == threadCode;
|
bool savedMatch = savedThreadCtx == thread.tp.ctx && savedThreadCtx2 == thread.tp.ctx2 && savedThreadCode == threadCode;
|
||||||
if (savedMatch) savedThreadCtx = savedThreadCtx2 = savedThreadCode[0] = 0;
|
if (savedMatch) savedThreadCtx = savedThreadCtx2 = savedThreadCode[0] = 0;
|
||||||
QMetaObject::invokeMethod(this, [this, ttString, savedMatch]
|
QMetaObject::invokeMethod(this, [this, ttString, savedMatch]
|
||||||
@ -209,13 +208,13 @@ bool MainWindow::SentenceReceived(TextThread& thread, std::wstring& sentence)
|
|||||||
|
|
||||||
QString MainWindow::TextThreadString(TextThread& thread)
|
QString MainWindow::TextThreadString(TextThread& thread)
|
||||||
{
|
{
|
||||||
return QString("%1:%2:%3:%4:%5: ").arg(
|
return QString("%1:%2:%3:%4:%5: %6 ").arg(
|
||||||
QString::number(thread.handle, 16),
|
QString::number(thread.handle, 16),
|
||||||
QString::number(thread.tp.processId, 16),
|
QString::number(thread.tp.processId, 16),
|
||||||
QString::number(thread.tp.addr, 16),
|
QString::number(thread.tp.addr, 16),
|
||||||
QString::number(thread.tp.ctx, 16),
|
QString::number(thread.tp.ctx, 16),
|
||||||
QString::number(thread.tp.ctx2, 16)
|
QString::number(thread.tp.ctx2, 16)
|
||||||
).toUpper();
|
).toUpper().arg(S(thread.name));
|
||||||
}
|
}
|
||||||
|
|
||||||
ThreadParam MainWindow::ParseTextThreadString(QString ttString)
|
ThreadParam MainWindow::ParseTextThreadString(QString ttString)
|
||||||
@ -233,9 +232,8 @@ std::array<InfoForExtension, 10> MainWindow::GetMiscInfo(TextThread& thread)
|
|||||||
{
|
{
|
||||||
void(*AddSentence)(MainWindow*, int64_t, const wchar_t*) = [](MainWindow* This, int64_t number, const wchar_t* sentence)
|
void(*AddSentence)(MainWindow*, int64_t, const wchar_t*) = [](MainWindow* This, int64_t number, const wchar_t* sentence)
|
||||||
{
|
{
|
||||||
std::wstring copy = sentence;
|
|
||||||
// pointer from Host::GetThread may not stay valid unless on main thread
|
// pointer from Host::GetThread may not stay valid unless on main thread
|
||||||
QMetaObject::invokeMethod(This, [=]() mutable { if (TextThread* thread = Host::GetThread(number)) thread->AddSentence(std::move(copy)); });
|
QMetaObject::invokeMethod(This, [number, sentence = std::wstring(sentence)] { if (TextThread* thread = Host::GetThread(number)) thread->AddSentence(sentence); });
|
||||||
};
|
};
|
||||||
|
|
||||||
return
|
return
|
||||||
@ -252,6 +250,18 @@ std::array<InfoForExtension, 10> MainWindow::GetMiscInfo(TextThread& thread)
|
|||||||
} };
|
} };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::optional<std::wstring> MainWindow::UserSelectedProcess()
|
||||||
|
{
|
||||||
|
QStringList savedProcesses = QString::fromUtf8(QTextFile(GAME_SAVE_FILE, QIODevice::ReadOnly).readAll()).split("\n", QString::SkipEmptyParts);
|
||||||
|
std::reverse(savedProcesses.begin(), savedProcesses.end());
|
||||||
|
savedProcesses.removeDuplicates();
|
||||||
|
savedProcesses.insert(1, FROM_COMPUTER);
|
||||||
|
QString process = QInputDialog::getItem(this, SELECT_PROCESS, SELECT_PROCESS_INFO, savedProcesses, 0, true, &ok, Qt::WindowCloseButtonHint);
|
||||||
|
if (process == FROM_COMPUTER) process = QDir::toNativeSeparators(QFileDialog::getOpenFileName(this, SELECT_PROCESS, "C:\\", PROCESSES));
|
||||||
|
if (ok && process.contains('\\')) return S(process);
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::AttachProcess()
|
void MainWindow::AttachProcess()
|
||||||
{
|
{
|
||||||
QMultiHash<QString, DWORD> allProcesses;
|
QMultiHash<QString, DWORD> allProcesses;
|
||||||
@ -267,14 +277,9 @@ void MainWindow::AttachProcess()
|
|||||||
|
|
||||||
void MainWindow::LaunchProcess()
|
void MainWindow::LaunchProcess()
|
||||||
{
|
{
|
||||||
QStringList savedProcesses = QString::fromUtf8(QTextFile(GAME_SAVE_FILE, QIODevice::ReadOnly).readAll()).split("\n", QString::SkipEmptyParts);
|
std::wstring process;
|
||||||
std::reverse(savedProcesses.begin(), savedProcesses.end());
|
if (auto selected = UserSelectedProcess()) process = selected.value();
|
||||||
savedProcesses.removeDuplicates();
|
else return;
|
||||||
savedProcesses.push_back(SEARCH_GAME);
|
|
||||||
std::wstring process = S(QInputDialog::getItem(this, SELECT_PROCESS, "", savedProcesses, 0, true, &ok, Qt::WindowCloseButtonHint));
|
|
||||||
if (!ok) return;
|
|
||||||
if (S(process) == SEARCH_GAME) process = S(QDir::toNativeSeparators(QFileDialog::getOpenFileName(this, SELECT_PROCESS, "C:\\", PROCESSES)));
|
|
||||||
if (process.find(L'\\') == std::wstring::npos) return;
|
|
||||||
std::wstring path = std::wstring(process).erase(process.rfind(L'\\'));
|
std::wstring path = std::wstring(process).erase(process.rfind(L'\\'));
|
||||||
|
|
||||||
PROCESS_INFORMATION info = {};
|
PROCESS_INFORMATION info = {};
|
||||||
@ -317,16 +322,16 @@ void MainWindow::DetachProcess()
|
|||||||
|
|
||||||
void MainWindow::ForgetProcess()
|
void MainWindow::ForgetProcess()
|
||||||
{
|
{
|
||||||
if (auto processName = Util::GetModuleFilename(GetSelectedProcessId()))
|
std::optional<std::wstring> processName = Util::GetModuleFilename(GetSelectedProcessId());
|
||||||
{
|
if (!processName) processName = UserSelectedProcess();
|
||||||
|
DetachProcess();
|
||||||
|
if (!processName) return;
|
||||||
for (auto file : { GAME_SAVE_FILE, HOOK_SAVE_FILE })
|
for (auto file : { GAME_SAVE_FILE, HOOK_SAVE_FILE })
|
||||||
{
|
{
|
||||||
QStringList lines = QString::fromUtf8(QTextFile(file, QIODevice::ReadOnly).readAll()).split("\n", QString::SkipEmptyParts);
|
QStringList lines = QString::fromUtf8(QTextFile(file, QIODevice::ReadOnly).readAll()).split("\n", QString::SkipEmptyParts);
|
||||||
lines.erase(std::remove_if(lines.begin(), lines.end(), [&](auto line) { return line.contains(S(processName.value())); }), lines.end());
|
lines.erase(std::remove_if(lines.begin(), lines.end(), [&](auto line) { return line.contains(S(processName.value())); }), lines.end());
|
||||||
QTextFile(file, QIODevice::WriteOnly | QIODevice::Truncate).write(lines.join("\n").toUtf8());
|
QTextFile(file, QIODevice::WriteOnly | QIODevice::Truncate).write(lines.join("\n").append("\n").toUtf8());
|
||||||
}
|
}
|
||||||
}
|
|
||||||
DetachProcess();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::AddHook()
|
void MainWindow::AddHook()
|
||||||
@ -432,11 +437,7 @@ void MainWindow::FindHooks()
|
|||||||
{
|
{
|
||||||
auto input = new QLineEdit(QString::number(value, 16), &dialog);
|
auto input = new QLineEdit(QString::number(value, 16), &dialog);
|
||||||
layout.addRow(label, input);
|
layout.addRow(label, input);
|
||||||
connect(input, &QLineEdit::textEdited, [&value](QString input)
|
connect(input, &QLineEdit::textEdited, [&value](QString text) { if (uintptr_t newValue = text.toULongLong(&ok, 16); ok) value = newValue; });
|
||||||
{
|
|
||||||
bool ok;
|
|
||||||
if (uintptr_t newValue = input.toULongLong(&ok, 16); ok) value = newValue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
QLineEdit filterInput(".", &dialog);
|
QLineEdit filterInput(".", &dialog);
|
||||||
layout.addRow(HOOK_SEARCH_FILTER, &filterInput);
|
layout.addRow(HOOK_SEARCH_FILTER, &filterInput);
|
||||||
|
@ -31,6 +31,7 @@ private:
|
|||||||
ThreadParam ParseTextThreadString(QString ttString);
|
ThreadParam ParseTextThreadString(QString ttString);
|
||||||
DWORD GetSelectedProcessId();
|
DWORD GetSelectedProcessId();
|
||||||
std::array<InfoForExtension, 10> GetMiscInfo(TextThread& thread);
|
std::array<InfoForExtension, 10> GetMiscInfo(TextThread& thread);
|
||||||
|
std::optional<std::wstring> UserSelectedProcess();
|
||||||
void AttachProcess();
|
void AttachProcess();
|
||||||
void LaunchProcess();
|
void LaunchProcess();
|
||||||
void DetachProcess();
|
void DetachProcess();
|
||||||
|
@ -80,7 +80,7 @@ private:
|
|||||||
|
|
||||||
QWidget centralWidget{ this };
|
QWidget centralWidget{ this };
|
||||||
QHBoxLayout layout{ ¢ralWidget };
|
QHBoxLayout layout{ ¢ralWidget };
|
||||||
QPlainTextEdit scriptEditor{ std::string(std::istreambuf_iterator<char>(std::ifstream(LUA_SAVE_FILE, std::ios::in)), {}).c_str(), ¢ralWidget };
|
QPlainTextEdit scriptEditor{ S(std::string(std::istreambuf_iterator<char>(std::ifstream(LUA_SAVE_FILE, std::ios::in)), {})), ¢ralWidget };
|
||||||
QPushButton loadButton{ LOAD_LUA_SCRIPT, ¢ralWidget };
|
QPushButton loadButton{ LOAD_LUA_SCRIPT, ¢ralWidget };
|
||||||
} window;
|
} window;
|
||||||
|
|
||||||
|
@ -28,7 +28,6 @@ constexpr auto CONFIG_FILE = u8"Textractor.ini";
|
|||||||
|
|
||||||
// Misc
|
// Misc
|
||||||
|
|
||||||
constexpr auto DEFAULT_EXTENSIONS = u8"Remove Repeated Characters>Remove Repeated Phrases>Regex Filter>Copy to Clipboard>Bing Translate>Extra Window>Extra Newlines";
|
|
||||||
constexpr auto WINDOW = u8"Window";
|
constexpr auto WINDOW = u8"Window";
|
||||||
|
|
||||||
// EOF
|
// EOF
|
||||||
|
@ -22,4 +22,5 @@
|
|||||||
|
|
||||||
struct QTextFile : QFile { QTextFile(QString name, QIODevice::OpenMode mode) : QFile(name) { open(mode | QIODevice::Text); } };
|
struct QTextFile : QFile { QTextFile(QString name, QIODevice::OpenMode mode) : QFile(name) { open(mode | QIODevice::Text); } };
|
||||||
inline std::wstring S(const QString& S) { return { S.toStdWString() }; }
|
inline std::wstring S(const QString& S) { return { S.toStdWString() }; }
|
||||||
|
inline QString S(const std::string& S) { return QString::fromStdString(S); }
|
||||||
inline QString S(const std::wstring& S) { return QString::fromStdWString(S); }
|
inline QString S(const std::wstring& S) { return QString::fromStdWString(S); }
|
||||||
|
13
text.cpp
13
text.cpp
@ -19,7 +19,8 @@ const char* EXTENSIONS = u8"Extensions";
|
|||||||
const char* SELECT_PROCESS = u8"Select process";
|
const char* SELECT_PROCESS = u8"Select process";
|
||||||
const char* ATTACH_INFO = u8R"(If you don't see the process you want to attach, try running with admin rights
|
const char* ATTACH_INFO = u8R"(If you don't see the process you want to attach, try running with admin rights
|
||||||
You can also type in the process id)";
|
You can also type in the process id)";
|
||||||
const char* SEARCH_GAME = u8"Select from computer";
|
const char* SELECT_PROCESS_INFO = u8"If you manually type in the process file name, please use the absolute path";
|
||||||
|
const char* FROM_COMPUTER = u8"Select from computer";
|
||||||
const char* PROCESSES = u8"Processes (*.exe)";
|
const char* PROCESSES = u8"Processes (*.exe)";
|
||||||
const char* CODE_INFODUMP = u8R"(Search for text
|
const char* CODE_INFODUMP = u8R"(Search for text
|
||||||
S[codepage#]text
|
S[codepage#]text
|
||||||
@ -207,7 +208,7 @@ Kaynak kodu GKLv3 koruması altında proje ana sayfasında mevcut
|
|||||||
SELECT_PROCESS = u8"Seleccionar procreso";
|
SELECT_PROCESS = u8"Seleccionar procreso";
|
||||||
ATTACH_INFO = u8R"(Si no ves el proceso que quieras adjuntar, ejecuta este programa como administrador
|
ATTACH_INFO = u8R"(Si no ves el proceso que quieras adjuntar, ejecuta este programa como administrador
|
||||||
También puedes escribir la ID del proceso)";
|
También puedes escribir la ID del proceso)";
|
||||||
SEARCH_GAME = u8"Seleccionar desde computadora";
|
FROM_COMPUTER = u8"Seleccionar desde computadora";
|
||||||
PROCESSES = u8"Procesos (*.exe)";
|
PROCESSES = u8"Procesos (*.exe)";
|
||||||
SAVE_SETTINGS = u8"Guardar opciones";
|
SAVE_SETTINGS = u8"Guardar opciones";
|
||||||
EXTEN_WINDOW_INSTRUCTIONS = u8R"(Arrrastra y suelta la extension (.dll) aquí desde tu computadora para añadirlos
|
EXTEN_WINDOW_INSTRUCTIONS = u8R"(Arrrastra y suelta la extension (.dll) aquí desde tu computadora para añadirlos
|
||||||
@ -271,7 +272,7 @@ Clic y arrastra los bordes de la ventana para moverla, o en la esquina inferior
|
|||||||
SELECT_PROCESS = u8"选择进程";
|
SELECT_PROCESS = u8"选择进程";
|
||||||
ATTACH_INFO = u8R"(如果没看见想要附加的进程,尝试使用管理员权限运行
|
ATTACH_INFO = u8R"(如果没看见想要附加的进程,尝试使用管理员权限运行
|
||||||
也可以手动输入进程ID)";
|
也可以手动输入进程ID)";
|
||||||
SEARCH_GAME = u8"从计算机中选择";
|
FROM_COMPUTER = u8"从计算机中选择";
|
||||||
PROCESSES = u8"进程 (*.exe)";
|
PROCESSES = u8"进程 (*.exe)";
|
||||||
SAVE_SETTINGS = u8"保存设置";
|
SAVE_SETTINGS = u8"保存设置";
|
||||||
EXTEN_WINDOW_INSTRUCTIONS = u8R"(从计算机拖拽扩展 (.dll) 文件到这里来添加
|
EXTEN_WINDOW_INSTRUCTIONS = u8R"(从计算机拖拽扩展 (.dll) 文件到这里来添加
|
||||||
@ -337,7 +338,7 @@ Clic y arrastra los bordes de la ventana para moverla, o en la esquina inferior
|
|||||||
SELECT_PROCESS = u8"Выберете процесс";
|
SELECT_PROCESS = u8"Выберете процесс";
|
||||||
ATTACH_INFO = u8R"(Если вы не видите процесс, к которому хотите присоединить, попробуйте запуск с правами администратора
|
ATTACH_INFO = u8R"(Если вы не видите процесс, к которому хотите присоединить, попробуйте запуск с правами администратора
|
||||||
Вы также можете ввести id процесса)";
|
Вы также можете ввести id процесса)";
|
||||||
SEARCH_GAME = u8"Найти в проводнике";
|
FROM_COMPUTER = u8"Найти в проводнике";
|
||||||
PROCESSES = u8"Процессы (*.exe)";
|
PROCESSES = u8"Процессы (*.exe)";
|
||||||
SAVE_SETTINGS = u8"Сохранить настройки";
|
SAVE_SETTINGS = u8"Сохранить настройки";
|
||||||
EXTEN_WINDOW_INSTRUCTIONS = u8R"(Перетащите сюда (.dll) файлы расширений из проводника для их добавления
|
EXTEN_WINDOW_INSTRUCTIONS = u8R"(Перетащите сюда (.dll) файлы расширений из проводника для их добавления
|
||||||
@ -442,7 +443,7 @@ end)";
|
|||||||
SELECT_PROCESS = u8"Pilih Proses";
|
SELECT_PROCESS = u8"Pilih Proses";
|
||||||
ATTACH_INFO = u8R"(Jika kamu tidak dapat melihat proses yang akan ditempelkan, coba menjalankan dengan mode administrator
|
ATTACH_INFO = u8R"(Jika kamu tidak dapat melihat proses yang akan ditempelkan, coba menjalankan dengan mode administrator
|
||||||
Kamu juga dapat mengetik process id game yang akan ditempel)";
|
Kamu juga dapat mengetik process id game yang akan ditempel)";
|
||||||
SEARCH_GAME = u8"Pilih dari komputer";
|
FROM_COMPUTER = u8"Pilih dari komputer";
|
||||||
PROCESSES = u8"Proses (*.exe)";
|
PROCESSES = u8"Proses (*.exe)";
|
||||||
SAVE_SETTINGS = u8"Simpan pengaturan";
|
SAVE_SETTINGS = u8"Simpan pengaturan";
|
||||||
EXTEN_WINDOW_INSTRUCTIONS = u8R"(Drag and drop file ekstensi (.dll) kedalam sini dari komputer kamu untuk menambah ekstensi
|
EXTEN_WINDOW_INSTRUCTIONS = u8R"(Drag and drop file ekstensi (.dll) kedalam sini dari komputer kamu untuk menambah ekstensi
|
||||||
@ -507,7 +508,7 @@ Klik dan tarik pinggiran jendela untuk memindahkan, atau sudut kanan bawah untuk
|
|||||||
EXTENSIONS = u8"Extensões";
|
EXTENSIONS = u8"Extensões";
|
||||||
SELECT_PROCESS = u8"Selecionar Processo";
|
SELECT_PROCESS = u8"Selecionar Processo";
|
||||||
ATTACH_INFO = u8R"(Se você não encontrar o processo o qual deseja anexar a, tente iniciar com permissão de Administrador. Você também pode digitar a ID do processo)";
|
ATTACH_INFO = u8R"(Se você não encontrar o processo o qual deseja anexar a, tente iniciar com permissão de Administrador. Você também pode digitar a ID do processo)";
|
||||||
SEARCH_GAME = u8"Busque no Computador";
|
FROM_COMPUTER = u8"Busque no Computador";
|
||||||
PROCESSES = u8"Executaveis (*.exe)";
|
PROCESSES = u8"Executaveis (*.exe)";
|
||||||
SAVE_SETTINGS = u8"Salvar opções";
|
SAVE_SETTINGS = u8"Salvar opções";
|
||||||
EXTEN_WINDOW_INSTRUCTIONS = u8R"(Arraste e solte a extensão (.dll) aqui para adicioná-la.
|
EXTEN_WINDOW_INSTRUCTIONS = u8R"(Arraste e solte a extensão (.dll) aqui para adicioná-la.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user