Files
fmviewer3/project/fm_viewer/rm_application.cpp
2026-02-21 17:11:31 +09:00

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)