#include "rm_application.h" #include "rm_include.h" #if !(PLAYER_ONLY_LIBRARY_MODE) #include #include #include 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)