-1
我正在開發QT for Windows的應用程序,並且存在以下問題: 1.某些用戶正在打開同一應用程序的多個實例,而不是允許。 如何控制每個用戶只打開一次應用程序,而不使用qtsingleapplication?QT Windows圖形用戶界面 - 如何每次只打開一次實例而沒有qtsingleapplication
我正在開發QT for Windows的應用程序,並且存在以下問題: 1.某些用戶正在打開同一應用程序的多個實例,而不是允許。 如何控制每個用戶只打開一次應用程序,而不使用qtsingleapplication?QT Windows圖形用戶界面 - 如何每次只打開一次實例而沒有qtsingleapplication
快速而骯髒的方法是創建一個鎖定文件。如果鎖定文件存在且進程處於活動狀態,則新實例將退出。下面給出一個粗略且未經檢查的示例。
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
爲什麼不使用QT提供的功能呢? –
您無法阻止某人多次打開您的應用程序,但您可以設置一個指定資源(互斥鎖,共享內存,命名管道等),並在該資源正在使用時立即退出您的應用程序。 – MrEricSir
我沒有任何意識如何實現。 –