first commit
This commit is contained in:
137
project/fm_viewer/rm_application.cpp
Normal file
137
project/fm_viewer/rm_application.cpp
Normal file
@@ -0,0 +1,137 @@
|
||||
#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)
|
||||
Reference in New Issue
Block a user