From 08b9e923b70fb641f87b3020ebefcd33194465d4 Mon Sep 17 00:00:00 2001 From: Peter Repukat Date: Fri, 15 Oct 2021 15:02:36 +0200 Subject: [PATCH] Minimum Transparent window --- .gitmodules | 3 ++ GlosSITarget/CMakeLists.txt | 17 ++++++ GlosSITarget/GlosSITarget.vcxproj | 24 +++++++++ GlosSITarget/GlosSITarget.vcxproj.filters | 11 ++++ GlosSITarget/SteamTarget.cpp | 9 +++- GlosSITarget/SteamTarget.h | 7 +++ GlosSITarget/TargetWindow.cpp | 64 +++++++++++++++++++++++ GlosSITarget/TargetWindow.h | 20 +++++++ GlosSITarget/main.cpp | 1 + deps/SFML | 1 + 10 files changed, 155 insertions(+), 2 deletions(-) create mode 100644 .gitmodules create mode 100644 GlosSITarget/CMakeLists.txt create mode 100644 GlosSITarget/TargetWindow.cpp create mode 100644 GlosSITarget/TargetWindow.h create mode 160000 deps/SFML diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..d132e41 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "deps/SFML"] + path = deps/SFML + url = git@github.com:SFML/SFML.git diff --git a/GlosSITarget/CMakeLists.txt b/GlosSITarget/CMakeLists.txt new file mode 100644 index 0000000..1726f7d --- /dev/null +++ b/GlosSITarget/CMakeLists.txt @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 3.7.2) + +project( + GlosSITarget + VERSION 1.0 + LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) +set_property(GLOBAL PROPERTY USE_FOLDERS ON) + + +add_executable( GlosSITarget + main.cpp + SteamTarget.cpp +) \ No newline at end of file diff --git a/GlosSITarget/GlosSITarget.vcxproj b/GlosSITarget/GlosSITarget.vcxproj index f4f3760..0f65b15 100644 --- a/GlosSITarget/GlosSITarget.vcxproj +++ b/GlosSITarget/GlosSITarget.vcxproj @@ -72,15 +72,23 @@ true + ..\deps\SFML\include;$(ExternalIncludePath) false + ..\deps\SFML\include;$(ExternalIncludePath) true + ..\deps\SFML\include;$(ExternalIncludePath) + ..\deps\SFML\out\build\x64-Debug\lib;$(LibraryPath) + false + true false + ..\deps\SFML\include;$(ExternalIncludePath) + ..\deps\SFML\out\build\x64-Release\lib;$(LibraryPath) @@ -116,10 +124,12 @@ true _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true + stdcpp20 Console true + sfml-window-d.lib;sfml-system-d.lib;sfml-graphics-d.lib;dwmapi.lib;%(AdditionalDependencies) @@ -130,6 +140,7 @@ true NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true + stdcpp20 Console @@ -141,9 +152,22 @@ + + + + + + true + + + true + + + true + diff --git a/GlosSITarget/GlosSITarget.vcxproj.filters b/GlosSITarget/GlosSITarget.vcxproj.filters index 46eb0ea..45e16d3 100644 --- a/GlosSITarget/GlosSITarget.vcxproj.filters +++ b/GlosSITarget/GlosSITarget.vcxproj.filters @@ -21,10 +21,21 @@ Source Files + + Source Files + Header Files + + Header Files + + + + + + \ No newline at end of file diff --git a/GlosSITarget/SteamTarget.cpp b/GlosSITarget/SteamTarget.cpp index 3ab4755..19de660 100644 --- a/GlosSITarget/SteamTarget.cpp +++ b/GlosSITarget/SteamTarget.cpp @@ -2,10 +2,15 @@ #include -SteamTarget::SteamTarget(int argc, char* argv[]) { +SteamTarget::SteamTarget(int argc, char* argv[]) : window_([this] { run_ = false; }) { } int SteamTarget::run() { + run_ = true; + window_.setFpsLimit(90); + while (run_) { + window_.update(); + } return 1; -} \ No newline at end of file +} diff --git a/GlosSITarget/SteamTarget.h b/GlosSITarget/SteamTarget.h index 22574df..a3ec8eb 100644 --- a/GlosSITarget/SteamTarget.h +++ b/GlosSITarget/SteamTarget.h @@ -1,8 +1,15 @@ #pragma once + +#include "TargetWindow.h" + class SteamTarget { public: explicit SteamTarget(int argc, char* argv[]); int run(); + +private: + bool run_ = false; + TargetWindow window_; }; diff --git a/GlosSITarget/TargetWindow.cpp b/GlosSITarget/TargetWindow.cpp new file mode 100644 index 0000000..268c321 --- /dev/null +++ b/GlosSITarget/TargetWindow.cpp @@ -0,0 +1,64 @@ +#include "TargetWindow.h" + +#include + +#include + +#ifdef _WIN32 +#include +#include +#endif + + +TargetWindow::TargetWindow(std::function on_close) : on_close_(std::move(on_close)) +{ + window_.create(sf::VideoMode::getDesktopMode(), "GlosSITarget", sf::Style::None); + window_.setActive(true); +#ifdef _WIN32 + HWND hwnd = window_.getSystemHandle(); + MARGINS margins; + margins.cxLeftWidth = -1; + DwmExtendFrameIntoClientArea(hwnd, &margins); + + // window clickthough. + SetWindowLong(hwnd, GWL_EXSTYLE, WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_TOPMOST); + + // always on top + SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); + + +#endif +} + +void TargetWindow::setFpsLimit(unsigned int fps_limit) +{ + window_.setFramerateLimit(fps_limit); +} + +void TargetWindow::setClickThrough(bool click_through) +{ + +} + + +void TargetWindow::update() +{ + sf::Event event{}; + while (window_.pollEvent(event)) + { + if (event.type == sf::Event::Closed) + { + window_.close(); + on_close_(); + } + } + window_.clear(sf::Color::Transparent); + //window_.clear(sf::Color(255,0,0,1)); + window_.display(); +} + +void TargetWindow::close() +{ + window_.close(); + on_close_(); +} diff --git a/GlosSITarget/TargetWindow.h b/GlosSITarget/TargetWindow.h new file mode 100644 index 0000000..1ebbdeb --- /dev/null +++ b/GlosSITarget/TargetWindow.h @@ -0,0 +1,20 @@ +#pragma once +#include + +#include + +class TargetWindow +{ +public: + explicit TargetWindow(std::function on_close = [](){}); + + void setFpsLimit(unsigned int fps_limit); + void setClickThrough(bool click_through); + void update(); + void close(); + +private: + const std::function on_close_; + sf::RenderWindow window_; +}; + diff --git a/GlosSITarget/main.cpp b/GlosSITarget/main.cpp index 1471764..337b0e5 100644 --- a/GlosSITarget/main.cpp +++ b/GlosSITarget/main.cpp @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #ifdef _WIN32 +#define NOMINMAX #include #endif diff --git a/deps/SFML b/deps/SFML new file mode 160000 index 0000000..3b1ff12 --- /dev/null +++ b/deps/SFML @@ -0,0 +1 @@ +Subproject commit 3b1ff125b06e010ec1acf1bbec113adc0c8c57cd