qt 控制台程序如何实现自动化交互
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了qt 控制台程序如何实现自动化交互相关的知识,希望对你有一定的参考价值。
参考技术A 可以做底层控制库包来实现。在原生系统中重新开发,进行细化分割形成loop,采用分离交互式来保证数据下发可靠性。
为了实现控制指令对比,会直接跳转到上一操作中。
QT中同一个程序的可执行程序只能运行一个,如何实现?
同一个可执行程序,只能执行一个,当打开第二次时,显示该执行程序已经被打开,并返回。QT下如何实现软件唯一性检查。
在windows下互斥体有个唯一的key,通过key去创建互斥体,如果这个互斥体已经存在了,那么通过GetLastError能获取到这个信息,表示程序已经在运行了。互斥体还有个优点就是在程序关闭时,会自动释放掉!
#include "mainwindow.h"
#include <QApplication>
#include <windows.h>
int main(int argc, char *argv[])
QApplication a(argc, argv);
QString strKey = "mykey";
LPCWSTR wstrKey = strKey.toStdWString().c_str();
HANDLE hMetex = CreateMutex(NULL,FALSE,wstrKey);
if(GetLastError() == ERROR_ALREADY_EXISTS)
//如果互斥体存在,说明程序已经有实例在运行了,释放资源然后关闭本实例
if(hMetex)
CloseHandle(hMetex);
hMetex = NULL;
return -1;
MainWindow w;
w.show();
return a.exec();
可以使用的方式有:
1、写注册表或者文件 缺点:程序异常退出会导致下次无法启动
2、使用操作系统原子变量,简单安全稳定
3、使用操作系统管道通信
4、重新制作一个专门的启动程序
5.、。。。
推荐第二种,一个函数即可解决问题。非常感谢您的耐心观看,如有帮助请采纳,祝生活愉快!谢谢! 参考技术B #ifdef _WIN32
#include <Windows.h>
#endif
#define DEF_NAME "exe name"
int main(int argc, char *argv[])
QApplication a(argc, argv);
MainWindow w;
#ifdef WIN32
CoInitialize(NULL);
QString name = DEF_NAME;
QSystemSemaphore sema(name,1,QSystemSemaphore::Open);
sema.acquire();// 在临界区操作共享内存 SharedMemory
QSharedMemory mem(QString("SystemObject_%1").arg(DEF_NAME));// 全局对象名
if (!mem.create(1))
// 如果全局对象已存在则退出
HWND hWnd = FindWindowA( "QWidget", DEF_NAME ); //需要调用一下SetWindowTextA(this->winId(),DEF_NAME); //windowsAPI 用于查找窗口
if(hWnd != NULL)
if( IsIconic( hWnd ) ) //是否最小化
ShowWindow( hWnd, SW_RESTORE );
SetForegroundWindow( hWnd );//最上层显示
else
//An instance has already been running.
sema.release();// 如果是 Unix 系统,会自动释放。
return 0;
sema.release();// 临界区
#endif
w.show();
return a.exec();
以上利用共享内存实现。
简单满足一下你的需求,还可以QLocalServer实现。
以上是关于qt 控制台程序如何实现自动化交互的主要内容,如果未能解决你的问题,请参考以下文章