大致思路是运用进程通讯机智。
在Win下这么实现:
若发现已有实例,就SendMessage,举例:
inline void SendProcessMessage(HWND wnd,uint wParam,QString message){// 发送进程通讯讯息
COPYDATASTRUCT cds;
cds.dwData=0;
cds.cbData=message.length()+1;
cds.lpData=message.toAscii().data();
SendMessage(wnd,WM_COPYDATA,wParam,(LPARAM)&cds);
}
在窗口初始化中:
// 只允许一个实例(此代码仅限WIN系统)
HANDLE m_hMutex = CreateMutex(NULL, FALSE, L"MyProgram");
if(m_hMutex)if(GetLastError() == ERROR_ALREADY_EXISTS){
SendProcessMessage(FindWindow(L"QWidget",(WCHAR*)tr("窗口标题").utf16()),NULL,"ShowMyProgram");
exit(0);
}
然后接收消息并处理:
bool Widget::winEvent ( MSG * message, long * result ){//监控消息
switch(message->message){
case WM_COPYDATA:{
COPYDATASTRUCT *cds = reinterpret_cast<COPYDATASTRUCT*>(message->lParam);
QString messagestring(static_cast<char*>(cds->lpData));
processMessage((HWND)message->wParam,messagestring);
}break;
}return QWidget::winEvent (message,result );
}
void Widget::processMessage(HWND wnd,QString message){//处理进程通讯讯息
if(message=="ShowMyProgram"){
show();//显示
SetWindowPos( winId(), HWND_TOP,0,0,0,0, SWP_NOSIZE| SWP_NOMOVE);//置顶
SetForegroundWindow(winId());//焦点
return;
}
}