138 lines
3.9 KiB
C++
138 lines
3.9 KiB
C++
#include "rm_application.h"
|
|
#include "rm_include.h"
|
|
#if !(PLAYER_ONLY_LIBRARY_MODE)
|
|
#include <Windows.h>
|
|
#include <Psapi.h>
|
|
|
|
#include <QFileInfo>
|
|
|
|
RMApplication* g_global_application = NULL;
|
|
|
|
|
|
// ----------------------------------------------------------------
|
|
// 동일한 윈도우인지 확인
|
|
BOOL IS_APPLICATION_WINDOW(HWND hWnd)
|
|
{
|
|
WCHAR buff[256] = {0,};
|
|
size_t memSize = sizeof(buff)/sizeof(buff[0]);
|
|
::ZeroMemory(buff,memSize);
|
|
::GetWindowText(hWnd, buff, (int)memSize-1);
|
|
|
|
BOOL is_same_window = FALSE;
|
|
QString str = QString::fromUtf16((const ushort*)buff);
|
|
#if (SETUP_ONLY_BUILD)
|
|
if(str == QString(WINDOW_TITLE) + "_SETUP")
|
|
#else
|
|
if(str == WINDOW_TITLE)
|
|
#endif
|
|
{
|
|
is_same_window = true;
|
|
DWORD process_id = NULL;
|
|
::GetWindowThreadProcessId(hWnd,&process_id);
|
|
if (process_id != NULL)
|
|
{
|
|
// 프로세스 확인 + 실행파일명 비교해서 동일한 윈도우 인지 확인
|
|
// 익스플로러에서 "Autovy_Viewer" 폴더가 열려 있을 경우 타이틀이 동일함
|
|
HANDLE hProcess = ::OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, process_id);
|
|
if (hProcess != NULL && hProcess != INVALID_HANDLE_VALUE)
|
|
{
|
|
::ZeroMemory(buff,memSize);
|
|
DWORD dwSize = memSize;
|
|
// XP 지원안됨
|
|
if(::GetProcessImageFileName(hProcess,buff,dwSize) > 0)
|
|
{
|
|
QString exe_name = QFileInfo(QCoreApplication::applicationFilePath()).fileName();
|
|
QString path = QString::fromUtf16((const ushort*)buff);
|
|
is_same_window = path.contains(exe_name,Qt::CaseInsensitive) == true;
|
|
}
|
|
else
|
|
{
|
|
is_same_window = TRUE;
|
|
}
|
|
::CloseHandle(hProcess);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
is_same_window = TRUE;
|
|
}
|
|
}
|
|
return is_same_window;
|
|
}
|
|
|
|
BOOL CALLBACK EnumWindowsProcShow(HWND hWnd, LPARAM lParam)
|
|
{
|
|
Q_UNUSED(lParam);
|
|
// WCHAR buff[255] = {0,};
|
|
if (IsWindowVisible(hWnd))
|
|
{
|
|
if(IS_APPLICATION_WINDOW(hWnd))
|
|
{
|
|
if (::IsIconic(hWnd) == TRUE)
|
|
{
|
|
::ShowWindow(hWnd, SW_NORMAL);
|
|
}
|
|
::SetForegroundWindow(hWnd);
|
|
#if (FILE_LOAD_MESSAGE) // 파일열기 메시지 전송
|
|
if(!RMApp::currentRoot.isEmpty()) {
|
|
|
|
char path[2048] = {0,};
|
|
int length = RMApp::currentRoot.toLocal8Bit().size();
|
|
memcpy(path,RMApp::currentRoot.toLocal8Bit().constData(),length);
|
|
COPYDATASTRUCT cds;
|
|
cds.lpData = (PVOID)path;//;
|
|
cds.cbData = length;//RMApp::currentRoot.toLocal8Bit().size();
|
|
cds.dwData = 0;
|
|
::SendMessage(hWnd, WM_COPYDATA, 0, (LPARAM)&cds);
|
|
}
|
|
#endif // FILE_LOAD_MESSAGE
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
RMApplication::RMApplication(int &argc, char **argv) : QApplication(argc, argv, true)
|
|
{
|
|
g_global_application = this;
|
|
#if (SETUP_ONLY_BUILD)
|
|
_singular = new QSharedMemory(QString(APPLICATION_KEY) + QString("_SETUP"), this);
|
|
#else
|
|
_singular = new QSharedMemory(APPLICATION_KEY, this);
|
|
#endif
|
|
|
|
}
|
|
RMApplication* RMApplication::instance()
|
|
{
|
|
return g_global_application;
|
|
}
|
|
|
|
RMApplication::~RMApplication()
|
|
{
|
|
if(_singular->isAttached())
|
|
{
|
|
_singular->detach();
|
|
}
|
|
}
|
|
void RMApplication::foregroundApplication()
|
|
{
|
|
::EnumWindows(EnumWindowsProcShow, 0); // 종료
|
|
::Sleep(200);
|
|
}
|
|
|
|
bool RMApplication::lock()
|
|
{
|
|
// Autovy 는 이미 출시되어 lock 을 사용하지 않고 윈도우 존재 여부로 처리함
|
|
if(_singular->attach(QSharedMemory::ReadOnly))
|
|
{
|
|
_singular->detach();
|
|
return false;
|
|
}
|
|
|
|
if(_singular->create(1))
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
#endif // #if !(PLAYER_ONLY_LIBRARY_MODE)
|