diff --git a/.gitignore b/.gitignore index 7b82457..a0b6b8c 100644 --- a/.gitignore +++ b/.gitignore @@ -362,5 +362,5 @@ MigrationBackup/ # Fody - auto-generated XML schema FodyWeavers.xsd -# Login info -resources/login_info.json +# Build +build/ diff --git a/ScreenMe.pri b/ScreenMe.pri new file mode 100644 index 0000000..d8d192a --- /dev/null +++ b/ScreenMe.pri @@ -0,0 +1,43 @@ +# ---------------------------------------------------- +# This file is generated by the Qt Visual Studio Tools. +# ------------------------------------------------------ + +# This is a reminder that you are using a generated .pro file. +# Remove it when you are finished editing this file. +message("You are running qmake on a generated .pro file. This may not work!") + + +QT += core gui widgets +QT += websockets + +HEADERS += ./include/config_manager.h \ + ./include/hotkeymap.h \ + ./include/uexception.h \ + ./include/uglobal.h \ + ./include/utils.h \ + ./include/screenshotdisplay.h \ + ./include/editor.h \ + ./include/customTextEdit.h \ + ./include/hotkeyEventFilter.h \ + ./include/globalKeyboardHook.h \ + ./include/main_window.h \ + ./include/ukeysequence.h \ + ./include/login_loader.h \ + ./include/login_server.h \ + ./include/uglobalhotkeys.h \ + ./include/options_window.h +SOURCES += ./src/customTextInput.cpp \ + ./src/editor.cpp \ + ./src/globalKeyboardHook.cpp \ + ./src/hotkeyEventFilter.cpp \ + ./src/login_loader.cpp \ + ./src/login_server.cpp \ + ./src/main_window.cpp \ + ./src/screenshotdisplay.cpp \ + ./src/uexception.cpp \ + ./src/uglobalhotkeys.cpp \ + ./src/ukeysequence.cpp \ + ./src/utils.cpp \ + ./main.cpp \ + ./src/config_manager.cpp \ + ./src/options_window.cpp diff --git a/ScreenMe.rc b/ScreenMe.rc new file mode 100644 index 0000000..6c4cbbf Binary files /dev/null and b/ScreenMe.rc differ diff --git a/include/utils.h b/include/utils.h index 6343c18..492a19a 100644 --- a/include/utils.h +++ b/include/utils.h @@ -6,10 +6,13 @@ QString getUniqueFilePath(const QString& folder, const QString& baseName, const QString& extension); void CaptureScreenshot(const QString& savePath); void displayScreenshotOnScreen(const QPixmap& pixmap); +QString getConfigFilePath(const QString& file); void saveLoginInfo(const QString& id, const QString& email, const QString& nickname, const QString& token); QString loadLoginInfo(); void clearLoginInfo(); +void setAutoStart(bool enable); + //const QString SCREEN_ME_HOST = "http://127.0.0.1:3001"; const QString SCREEN_ME_HOST = "https://screen-me.cloud"; \ No newline at end of file diff --git a/main.cpp b/main.cpp index 4a8d6f0..4de3b84 100644 --- a/main.cpp +++ b/main.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include "include/login_loader.h" @@ -20,7 +21,8 @@ using namespace std; -const QString VERSION = "1.1.0"; +#define SHARED_MEM_KEY "ScreenMeSharedMemory" +const QString VERSION = "1.1.1"; static void showAboutDialog() { QMessageBox aboutBox; @@ -50,6 +52,13 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, char*, int nShowCmd) FreeConsole(); #endif + QSharedMemory sharedMemory(SHARED_MEM_KEY); + if (!sharedMemory.create(1)) { + QMessageBox::warning(nullptr, "ScreenMe is already running", + "An instance of this application is already running. Please quit existing ScreenMe process first."); + return 1; + } + QString jsonStr = loadLoginInfo(); QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonStr.toUtf8()); QJsonObject loginInfo = jsonDoc.object(); @@ -58,6 +67,15 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, char*, int nShowCmd) QSystemTrayIcon trayIcon(QIcon("resources/icon.png")); QMenu trayMenu; + QJsonObject config = configManager.loadConfig(); + QVariant startWithSystemVar = config["start_with_system"].toBool(); + if (startWithSystemVar.isValid() && startWithSystemVar.toBool()) { + setAutoStart(true); + } + else { + setAutoStart(false); + } + QAction loginAction("Login to ScreenMe", &trayMenu); QAction takeScreenshotAction("Take Screenshot", &trayMenu); QAction takeFullscreenScreenshotAction("Take Fullscreen Screenshot", &trayMenu); diff --git a/resources/config.json b/resources/config.json deleted file mode 100644 index aa768c8..0000000 --- a/resources/config.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "default_save_folder": "~/Pictures/ScreenMe", - "file_extension": "png", - "fullscreen_hotkey": "Ctrl+Shift+Print", - "image_quality": 100, - "screenshot_hotkey": "Print", - "start_with_system": true -} diff --git a/src/config_manager.cpp b/src/config_manager.cpp index 5985541..b5d730c 100644 --- a/src/config_manager.cpp +++ b/src/config_manager.cpp @@ -1,39 +1,43 @@ #include "include/config_manager.h" +#include "include/utils.h" #include #include #include #include ConfigManager::ConfigManager(const QString& configPath) : configPath(configPath) { - QFile file(configPath); - if (!file.exists()) { + QString filePath = getConfigFilePath("config.json"); + QFile configFile(filePath); + if (!configFile.exists()) { QJsonObject defaultConfig; - defaultConfig["screenshot_hotkey"] = "Ctrl+Shift+S"; - defaultConfig["fullscreen_hotkey"] = "Ctrl+Shift+F"; + defaultConfig["screenshot_hotkey"] = "Print"; + defaultConfig["fullscreen_hotkey"] = "Ctrl+Shift+Print"; defaultConfig["file_extension"] = "png"; defaultConfig["image_quality"] = 90; - defaultConfig["default_save_folder"] = QDir::homePath(); - defaultConfig["start_with_system"] = false; + defaultConfig["default_save_folder"] = QDir::homePath() + "/Pictures/ScreenMe"; + defaultConfig["start_with_system"] = true; saveConfig(defaultConfig); } } QJsonObject ConfigManager::loadConfig() { - QFile file(configPath); - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QString filePath = getConfigFilePath("config.json"); + QFile configFile(filePath); + if (!configFile.open(QIODevice::ReadOnly | QIODevice::Text)) { return QJsonObject(); } - QJsonDocument doc = QJsonDocument::fromJson(file.readAll()); - file.close(); + QJsonDocument doc = QJsonDocument::fromJson(configFile.readAll()); + configFile.close(); return doc.object(); } void ConfigManager::saveConfig(const QJsonObject& config) { - QFile file(configPath); - if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + QString filePath = getConfigFilePath("config.json"); + QFile configFile(filePath); + if (!configFile.open(QIODevice::WriteOnly | QIODevice::Text)) { return; } QJsonDocument doc(config); - file.write(doc.toJson()); - file.close(); + configFile.write(doc.toJson()); + configFile.close(); } diff --git a/src/utils.cpp b/src/utils.cpp index 2d93b53..454390a 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -9,6 +9,8 @@ #include #include #include +#include +#include QString getUniqueFilePath(const QString& folder, const QString& baseName, const QString& extension) { QDir dir(folder); @@ -26,6 +28,15 @@ QString getUniqueFilePath(const QString& folder, const QString& baseName, const return filePath; } +QString getConfigFilePath(const QString& file) { + QString configPath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); + QDir dir(configPath); + if (!dir.exists()) { + dir.mkpath("."); + } + return dir.filePath(file); +} + void CaptureScreenshot(const QString& savePath) { QScreen* screen = QGuiApplication::primaryScreen(); if (!screen) { @@ -43,8 +54,9 @@ void displayScreenshotOnScreen(const QPixmap& pixmap) { } void saveLoginInfo(const QString& id, const QString& email, const QString& nickname, const QString& token) { - QFile file("resources/login_info.json"); - if (file.open(QIODevice::WriteOnly)) { + QString filePath = getConfigFilePath("login_info.json"); + QFile loginFile(filePath); + if (loginFile.open(QIODevice::WriteOnly)) { QJsonObject jsonObj; jsonObj["id"] = id; jsonObj["email"] = email; @@ -52,20 +64,36 @@ void saveLoginInfo(const QString& id, const QString& email, const QString& nickn jsonObj["token"] = token; QJsonDocument jsonDoc(jsonObj); - file.write(jsonDoc.toJson()); + loginFile.write(jsonDoc.toJson()); } } QString loadLoginInfo() { - QFile file("resources/login_info.json"); - if (file.open(QIODevice::ReadOnly)) { - QByteArray data = file.readAll(); + QString filePath = getConfigFilePath("login_info.json"); + QFile loginFile(filePath); + if (loginFile.open(QIODevice::ReadOnly)) { + QByteArray data = loginFile.readAll(); return QString(data); } return QString(); } void clearLoginInfo() { - QFile file("resources/login_info.json"); - file.remove(); + QString filePath = getConfigFilePath("login_info.json"); + QFile loginFile(filePath); + loginFile.remove(); +} + + +void setAutoStart(bool enable) { + QSettings settings("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run", QSettings::NativeFormat); + + if (enable) { + QString applicationName = QApplication::applicationName(); + QString applicationPath = QDir::toNativeSeparators(QCoreApplication::applicationFilePath()); + settings.setValue(applicationName, applicationPath); + } + else { + settings.remove(QApplication::applicationName()); + } } \ No newline at end of file