// Windouw API 依赖头文件
#include <windows.h>
#include <winbase.h>
// Qt 依赖头文件
#include <QSystemSemaphore>
#include <QSharedMemory>
int main(int argc, char *argv[])
{
// ......
//.....其他代码
/** 程序是否已经打开检测和激活并置于最前端控制 */
//@ 1.首先判断程序是否已经打开
QSystemSemaphore semaphore("BTSemap", 1);
semaphore.acquire();
QSharedMemory shareMemory("BTKey");//建立共享内存对象,BTKey为改程序设置的共享内存key值,用户根据自己需要设定
bool isRunning =false;
if (shareMemory.attach())//判断软件是否已经打开
{
isRunning = true;//已经打开
}
else
{
shareMemory.create(1);//软件未打开,则创建共享内存
isRunning = false;
}
semaphore.release();
//@ 2.软件已经打开,则将软件激活,并置于桌面最前面
if (isRunning)
{
//@ 将软件激活,显示在最前端
QString wTitle = QString("TestProgram");//Qt创建的主MainWindow的 标题
HWND handle = FindWindow(nullptr,wTitle.toLocal8Bit().toStdString().c_str());//基于windows Api 获取程序窗口的句柄
if (handle == nullptr)//判断是否为空
{
return -1;
}
ShowWindow(handle, SW_RESTORE);//激活窗口,参数:SW_RESTORE,以程序之前的大小显示,可以根据需要设置其他标识,如SW_MAXIMIZE
SetForegroundWindow(handle);//激活窗口在桌面最前面
return 1;
}
//@ 3.若程序未打开,则正常执行程序,如以下屏蔽的代码,正常启动主界面程序
//TMainWindow w;
//w.show();
//int ret = a.exec();
return 0;
}