2017-06-01 53 views
-1

我正在開發QT for Windows的應用程序,並且存在以下問題: 1.某些用戶正在打開同一應用程序的多個實例,而不是允許。 如何控制每個用戶只打開一次應用程序,而不使用qtsingleapplication?QT Windows圖形用戶界面 - 如何每次只打開一次實例而沒有qtsingleapplication

+3

爲什麼不使用QT提供的功能呢? –

+0

您無法阻止某人多次打開您的應用程序,但您可以設置一個指定資源(互斥鎖,共享內存,命名管道等),並在該資源正在使用時立即退出您的應用程序。 – MrEricSir

+0

我沒有任何意識如何實現。 –

回答

0

快速而骯髒的方法是創建一個鎖定文件。如果鎖定文件存在且進程處於活動狀態,則新實例將退出。下面給出一個粗略且未經檢查的示例。

bool isProcessRunning(DWORD processID, std::string processName) { 

    TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>"); 

    // Get a handle to the process. 

    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID); 

    // Get the process name. 

    if (NULL != hProcess) { 
     HMODULE hMod; 
     DWORD cbNeeded; 

     if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded)) 
      GetModuleBaseName(hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR)); 
    } 

    // Compare process name with your string 
    bool matchFound = !_tcscmp(szProcessName, processName.c_str()); 

    // Release the handle to the process. 
    CloseHandle(hProcess); 

    return matchFound; 
}; 

void lockApp() { 
    /* 
     * 
     * lockApp() -> None 
     * 
     * Lock app to one instance 
     * 
     * @return None 
     * 
    */ 

    /* Flags */ 
    int pid = -1; 
    bool procRunning = true; 

    /* App Lock file: Name and Location */ 
    QString lockFile = QDir::temp().filePath("MyAppName.lock"); 

    // check for the lock file and see if its stale. 
    if (QFileInfo(lockFile).exists()) { 

     // OK, lock exists. Now, check if it is stale! 
     QFile pidFile(lockFile); 
     pidFile.open(QFile::ReadOnly); 
     pid = pidFile.readAll().toInt(); 
     pidFile.close(); 

     // if /proc/pid doesnot exist, we have a stale lock 
     if(isProcessRunning(pid, "MyAppName")) { 
      procRunning = false; 
      QFile::remove(lockFile); 
     } 
    } 

    else { 

     procRunning = false; 
    } 

    if (procRunning) { 
     qApp->quit(); 
     exit(0); 
    } 

    QFile pidFile(lockFile); 
    pidFile.open(QFile::WriteOnly); 
    pidFile.write(qPrintable(QString::number(qApp->applicationPid()))); 
    pidFile.close(); 
}; 

第一個功能是從這裏拿走的。 https://stackoverflow.com/a/13635127/1233513

相關問題