我们写的程序一般都是可以多次运行的,就比如我随便打开的这个程序,我们一直双击,它会一直启动:
但是有时候哦我们只需要一个进程实例,那我们该怎么办呢?一个进程实例具体是什么时候啊?来看一下Windows的任务管理器:
还有我们平时用的PC版那个绿色的社交软件,只要登录一个账号之后,你每次启动进程,你都会发现打开的是已经登录的那个页面,也就是无法同时登录两个账号(ps: 特殊方法除外)。那我们自己写的程序要做到这一点,是否有难度呢?其实是比较简单的,只需要你对windows编程有一些基础的了解即可。接下啦手把手带大家写一个程序,只能启动一个实例,先说一下环境,我是拿vs写的,默认编码是UNICODE字符集,如果照着我的代码写,编译报错,可以看看字符集的问题:
我们拿简单的console程序距离,主要是说一下用法,首先我们来创建一个GUID,GUID的创建可以使用vs自带的工具,也可以自己网上去查找其它的创建方法,GUID是唯一身份标识码,就和我们身份证ID一样,唯一的。
#include<iostream> #include<windows.h> int main(int argc, LPWSTR* argv) { //创建一个互斥体,带有GUID的,如果成功,则返回有效句柄值 GUID是我们通过vs刚生成的 HANDLE mutexHandle = CreateMutexW(NULL, FALSE, L"Global\\{66451FDE-56B1-406A-9810-D6B372BAE28E}"); if (ERROR_ALREADY_EXISTS == GetLastError()) { if (mutexHandle) { CloseHandle(mutexHandle); } MessageBox(NULL, "exist", "single", NULL); goto exit; } std::cout << "starting" << std::endl; exit: return 0; }
最后的运行效果如下图所示:
大家可以尝试在这个基础之上改一下这个demo,让它变成,如果程序已经运行就把程序重新加载起来(类似刷新的效果),就好像,打开任务管理器一样的效果,祝大家修改顺利!
其中虽然代码少,但是涉及到windows开发的两个重要基础知识,句柄和互斥体对象,如果大家想了解,那我就后期更新一下这两个小知识点。