单例程序检测:
#include "speechfusion.h"
#include <QtWidgets/QApplication>
#include <QFontDatabase>
#include <QSharedMemory>
#include <QMessageBox>
#include "WaitSignal.h"
#include <qmutex.h>
#include <windows.h>
using namespace std;
bool CheckOnly()
{
// 创建互斥量 //获取名SpeechFusion的句柄如,果返回的是一个有效句柄,但指定的名字已经存在,GetLastError也会设为ERROR_ALREADY_EXISTS
HANDLE m_hMutex = CreateMutex(NULL, FALSE, L"SpeechFusion");
// 检查错误代码
if (GetLastError() == ERROR_ALREADY_EXISTS) {
// 如果已有互斥量存在,获取控制权并等待两秒
while (true)
{
DWORD ret = WaitForSingleObjectEx(m_hMutex, 200, true);
if (ret == WAIT_OBJECT_0)
{
_sleep(500);
ReleaseMutex(m_hMutex);
break;
}
}
//释放句柄并复位互斥量
CloseHandle(m_hMutex);
m_hMutex = NULL;
// 程序退出
return false;
}
else
return true;
}
int main(int argc, char *argv[])
{
if (CheckOnly())
{
QApplication a(argc, argv);
int nIndex = QFontDatabase::addApplicationFont(":/SpeechFusion/Resources/SourceHanSansCN-Normal.otf"); //加载字体
if (nIndex != -1)
{
QStringList strList(QFontDatabase::applicationFontFamilies(nIndex));
if (strList.count() > 0)
{
QFont fontThis(strList.at(0));
fontThis.setPointSize(14);
fontThis.setBold(true);
fontThis.setWeight(QFont::Normal);
a.setFont(fontThis);
}
}
SpeechFusion::GetInstance()->initView();
SpeechFusion::GetInstance()->show();//显示界面
WaitSignal *w = new WaitSignal(NULL);
return a.exec();
}
}
等待信号量程序:
#pragma once
#include <QObject>
#include <windows.h>
#include <QTimer>
class WaitSignal :public QObject
{
public:
WaitSignal(QObject *parent);
~WaitSignal();
public slots:
void slot_WaitOtherOpenTimer_timeOut();
private:
HANDLE m_hMutex;
QTimer waitOtherOpenTimer;
};
#include "WaitSignal.h"
#include "speechfusion.h"
#include <QFontDatabase>
WaitSignal::WaitSignal(QObject *parent)
: QObject(parent)
{
m_hMutex = CreateMutex(NULL, FALSE, L"SpeechFusion");
waitOtherOpenTimer.setInterval(10);
waitOtherOpenTimer.setSingleShot(false);
connect(&waitOtherOpenTimer, SIGNAL(timeout()), this, SLOT(slot_WaitOtherOpenTimer_timeOut()));
waitOtherOpenTimer.start();
}
WaitSignal::~WaitSignal()
{
}
void WaitSignal::slot_WaitOtherOpenTimer_timeOut()
{
DWORD ret = WaitForSingleObject(m_hMutex, 0);
//没有拿到句柄,说明程序已经启动
if (ret == WAIT_TIMEOUT)
{
//1
// SpeechFusion::GetInstance()->activateWindow();
// SpeechFusion::GetInstance()->show();//显示界面
// SpeechFusion::GetInstance()->raise();
//2
SpeechFusion::GetInstance()->activateWindow();
SpeechFusion::GetInstance()->setWindowState((SpeechFusion::GetInstance()->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
//3
//设置窗口置顶
// ::SetWindowPos(HWND(SpeechFusion::GetInstance()->winId()), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
// ::SetWindowPos(HWND(SpeechFusion::GetInstance()->winId()), HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
// SpeechFusion::GetInstance()->show();
// SpeechFusion::GetInstance()->activateWindow();
}
else if (ret == WAIT_OBJECT_0) {
ReleaseMutex(m_hMutex);
}
}