From 53a42e3dd887615f3aebadc6c53921532f01e6c4 Mon Sep 17 00:00:00 2001 From: Roland Winklmeier Date: Fri, 22 Aug 2014 17:28:23 +0200 Subject: [PATCH] refs #76 cross platform class to find and return pointer to a foreign window --- src/blackgui/blackgui.pro | 5 ++++ src/blackgui/win/windowfinder_win.cpp | 41 +++++++++++++++++++++++++++ src/blackgui/win/windowfinder_win.h | 36 +++++++++++++++++++++++ src/blackgui/windowfinder.cpp | 34 ++++++++++++++++++++++ src/blackgui/windowfinder.h | 40 ++++++++++++++++++++++++++ 5 files changed, 156 insertions(+) create mode 100644 src/blackgui/win/windowfinder_win.cpp create mode 100644 src/blackgui/win/windowfinder_win.h create mode 100644 src/blackgui/windowfinder.cpp create mode 100644 src/blackgui/windowfinder.h diff --git a/src/blackgui/blackgui.pro b/src/blackgui/blackgui.pro index a430daeec..7be40cf86 100644 --- a/src/blackgui/blackgui.pro +++ b/src/blackgui/blackgui.pro @@ -35,6 +35,11 @@ SOURCES += $$PWD/components/*.cpp FORMS += $$PWD/components/*.ui FORMS += $$PWD/*.ui +win32 { + HEADERS += $$PWD/win/*.h + SOURCES += $$PWD/win/*.cpp +} + RESOURCES += DESTDIR = ../../lib diff --git a/src/blackgui/win/windowfinder_win.cpp b/src/blackgui/win/windowfinder_win.cpp new file mode 100644 index 000000000..f2f69e686 --- /dev/null +++ b/src/blackgui/win/windowfinder_win.cpp @@ -0,0 +1,41 @@ +/* Copyright (C) 2014 + * swift Project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of Swift Project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +#include "windowfinder_win.h" +#include +#include + +#include + +namespace BlackGui +{ + QWindow *CWindowFinderWindows::findForeignWindow(const QString &windowName, const QString &className) + { + QScopedArrayPointer lpWindowName; + QScopedArrayPointer lpClassName; + + if (!windowName.isEmpty()) + { + lpWindowName.reset(new TCHAR[windowName.size()+1]); + windowName.toWCharArray(lpWindowName.data()); + lpWindowName[windowName.size()] = 0; + } + if (!className.isEmpty()) + { + lpClassName.reset(new TCHAR[className.size()+1]); + className.toWCharArray(lpClassName.data()); + lpClassName[className.size()] = 0; + } + + HWND hWindow = FindWindow(lpClassName.data(), lpWindowName.data()); + + if (hWindow) return QWindow::fromWinId(reinterpret_cast(hWindow)); + else return nullptr; + } +} diff --git a/src/blackgui/win/windowfinder_win.h b/src/blackgui/win/windowfinder_win.h new file mode 100644 index 000000000..ee477107f --- /dev/null +++ b/src/blackgui/win/windowfinder_win.h @@ -0,0 +1,36 @@ +/* Copyright (C) 2014 + * swift Project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of Swift Project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +//! \file + +#ifndef BLACKGUI_WINDOWFINDERWINDOWS_H +#define BLACKGUI_WINDOWFINDERWINDOWS_H + +#include "../windowfinder.h" + +namespace BlackGui +{ + //! Foreign windows + class CWindowFinderWindows : public IWindowFinder + { + public: + + //! Constructor + CWindowFinderWindows() {} + + //! Destructor + virtual ~CWindowFinderWindows() {} + + //! \copydoc IWindowFinder::findForeignWindow + virtual QWindow *findForeignWindow(const QString &windowName, const QString &className) override; + + }; +} + +#endif // guard diff --git a/src/blackgui/windowfinder.cpp b/src/blackgui/windowfinder.cpp new file mode 100644 index 000000000..72b4e5187 --- /dev/null +++ b/src/blackgui/windowfinder.cpp @@ -0,0 +1,34 @@ +/* Copyright (C) 2014 + * swift Project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of Swift Project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +#include "windowfinder.h" + +#if defined(Q_OS_WIN) + #include "win/windowfinder_win.h" +#elif defined(Q_OS_LINUX) +#elif defined(Q_OS_OSX) +#else + #error "Platform is not supported!" +#endif + +namespace BlackGui +{ + IWindowFinder *IWindowFinder::create() + { + IWindowFinder *finder = nullptr; + +#if defined(Q_OS_WIN) + finder = new CWindowFinderWindows(); +#elif defined(Q_OS_LINUX) +#elif defined(Q_OS_OSX) +#endif + + return finder; + } +} diff --git a/src/blackgui/windowfinder.h b/src/blackgui/windowfinder.h new file mode 100644 index 000000000..cdd4fad30 --- /dev/null +++ b/src/blackgui/windowfinder.h @@ -0,0 +1,40 @@ +/* Copyright (C) 2014 + * swift Project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of Swift Project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +//! \file + +#ifndef BLACKGUI_WINDOWFINDER_H +#define BLACKGUI_WINDOWFINDER_H + +#include + +class QWindow; + +namespace BlackGui +{ + //! Finder for foreign windows + class IWindowFinder + { + public: + + //! Constructor + IWindowFinder() {} + + //! Destructor + virtual ~IWindowFinder() {} + + //! Find and return a foreign window owned by another process + virtual QWindow *findForeignWindow(const QString &windowName, const QString &className) = 0; + + //! Factory method + static IWindowFinder *create(); + }; +} + +#endif // guard