refs #76 cross platform class to find and return pointer to a foreign window

This commit is contained in:
Roland Winklmeier
2014-08-22 17:28:23 +02:00
parent c1895c1ab2
commit 53a42e3dd8
5 changed files with 156 additions and 0 deletions

View File

@@ -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

View File

@@ -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 <QWindow>
#include <QScopedArrayPointer>
#include <windows.h>
namespace BlackGui
{
QWindow *CWindowFinderWindows::findForeignWindow(const QString &windowName, const QString &className)
{
QScopedArrayPointer<TCHAR> lpWindowName;
QScopedArrayPointer<TCHAR> 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<WId>(hWindow));
else return nullptr;
}
}

View File

@@ -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

View File

@@ -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;
}
}

View File

@@ -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 <QString>
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