
创建一个 互斥体 ,其它判断都是不最理想的,而且创建互斥体也就几个API的事
‘以下是API声明及数据类型
版本 2
DLL命令 CreateMutex, 整数型, "kernel32dll", "CreateMutexA"
参数 互斥体结构, SECURITY_ATTRIBUTES
参数 拥有互斥体, 逻辑型
参数 互斥体对象的名字, 文本型
DLL命令 WaitForSingleObject, 整数型, , "WaitForSingleObject"
参数 hHandle, 整数型
参数 dwMilliseconds, 整数型
DLL命令 ReleaseMutex, 整数型, "kernel32dll", "ReleaseMutex"
参数 hMutex, 整数型
DLL命令 CloseHandle, 逻辑型, , "CloseHandle", 公开
参数 hObject, 整数型
版本 2
数据类型 SECURITY_ATTRIBUTES, , 安全性结构;
成员 nLength, 整数型
成员 lpSecurityDescriptor, 整数型
成员 bInheritHandle, 整数型
‘以下是子程序代码
版本 2
子程序 系统_禁止重复运行, 逻辑型, 公开, 已经运行返回真,否则返回假
参数 特征字串, 文本型
局部变量 句柄, 整数型
局部变量 安全结构, SECURITY_ATTRIBUTES
句柄 = CreateMutex (安全结构, 真, 特征字串)’特征字串 是判断是否存在这个互斥体
如果真 (WaitForSingleObject (句柄, 100) = 258)
ReleaseMutex (句柄)
CloseHandle (句柄)
返回 (真)
如果真结束
返回 (假)
在现实中的我们在网络上却又很多张脸,多开微信很多人都是需要的,这里就介绍3个方法给大家多开。
方法1:BAT文件
鼠标右键单击微信图标选择 属性
在属性选项夹内复制 “目标”例如我的是('D:\\Program Files (x86)\\Tencent\\WeChat\\WeChatexe')
到桌面或者任意文件夹内新建一个txt文件
输入以下代码(双开 - 其中 start /d '微信目录' WeChatexe 多一行就表示多开一个)
#这里 微信目录 改为你自己的目录 例如我的是 D:\\Program Files (x86)\\Tencent\\WeChat\\
所以我的代码是
5然后把txt文件保存,改名为bat格式。
6双击运行即可打开两个微信。(可以保存这个bat文件每次打开就双开微信)
GIF教程:
方法1缺陷和优点和提示:
缺陷:必须完全关闭微信的所有进程,需要一丢丢的手动 *** 作能力,这个是用命令瞬间打开打到多开的效果。(如果用过关闭互斥体的方式可能导致失效,这个时候需要注销下系统重新进)
优点:无须下载任何工具软件,无病毒木马入侵风险,还是很推荐的。
提示:如果无法改名是因为没有关闭文件夹选项的,隐藏已知文件类型的扩展名的功能。
方法2:关闭互斥体
互斥体就是单开软件在系统注册的一个名字类的东西,比如一个人的身份z号码,如果已经有了,你就不用在注册了,所以某些单开软件打开了一个的情况下会注册一个互斥体,而再次打开的时候,软件会先判断是不是有了这个软件,而如果已经有了就结束了新开的那个进程,导致不能多开。
所以只要关闭互斥体就可以了,下面教大家如何用PCHunter关闭微信的互斥体。
下载PCHunter
打开一个微信之后,打开PCHunter,并且找到微信的进程(微信进程在里面显示是名是:Wechatexe 32 [32是表示这个是个32位的进程,如果没有就是64位,64位进程才会显示哦])
鼠标右键对准微信进程单击,然后选择查看进程句柄。
在打开的进程句柄处点击句柄类型按名称排序一下列表。
找到Mutant的句柄类型,用鼠标单击第一条开始,期间按住Shift键然后选择最后一条。
在选中的表项里面点击鼠标右键,关闭句柄。
直接可以多开一个微信了。
方法2缺陷和优点和提示:
缺陷
C#禁止应用程序同时运行的方法
using System;
using SystemCollectionsGeneric;
using SystemWindowsForms;
namespace SingleProcessStart
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
//
//使用STAThread属性将程序的默认线程模型指定为单线程模型。
//注意,线程模型只影响使用COM interop的应用程序,将这个属性应用于不使用COM interop的程序将不会产生任何效果。
[STAThread]
//[MTAThreadAttribute]
static void Main()
{
////原始
//ApplicationEnableVisualStyles();
//ApplicationSetCompatibleTextRenderingDefault(false);
//ApplicationRun(new Form1());
//方法一,使用线程互斥
//bool createdNew = false;
//SystemThreadingMutex mutex = new SystemThreadingMutex(true, "OnlyOnceTime", out createdNew);
//if (createdNew)
//{
// ApplicationEnableVisualStyles();
// ApplicationSetCompatibleTextRenderingDefault(false);
// ApplicationRun(new Form1());
//}
//else
//{
// MessageBoxShow("程序已经运行!", "提示", MessageBoxButtonsOK, MessageBoxIconExclamation);
//}
//方法二,使用API实现
/
关于方法二的调试,需要注意的是要将项目--属性--调试,选择启用外部程序,选择到你的EXE文件,然后先开启你的EXE文件
否则在调试时NET默认会使用vshostexe的宿主进程(宿主进程随NET启动而启动),而此宿主进程在外部无法启用,因此永远是唯一的
/
SystemDiagnosticsProcess p = GetRunningInstance();
if (p != null) //已经有应用程序副本执行
{
HandleRunningInstance(p);
}
else //启动第一个应用程序
{
ApplicationEnableVisualStyles();
ApplicationSetCompatibleTextRenderingDefault(false);
ApplicationRun(new Form1());
}
}
//以下为方法二调用API代码
private const int WS_HIDE = 0;//窗口隐藏
private const int WS_SHOWNORMAL = 1;//窗口处于正常状态
private const int WS_SHOWMIN = 2;//窗口处于最小化状态
private const int WS_SHOWMAX = 3;//窗口处于最大化状态
/// <summary>
/// 显示窗口
/// </summary>
/// <param name="hWnd">句柄</param>
/// <param name="cmdShow">显示模式</param>
/// <returns></returns>
[SystemRuntimeInteropServicesDllImport("User32dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
[SystemRuntimeInteropServicesDllImport("User32dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
/// <summary>
/// 查找窗口的句柄
/// </summary>
/// <param name="className">指向包含了窗口类名的空中止(C语言)字串的指针;或设为零,表示接收任何类</param>
/// <param name="titleName">指向包含了窗口文本(或标签)的空中止(C语言)字串的指针;或设为零,表示接收任何窗口标题</param>
/// <returns>句柄</returns>
[SystemRuntimeInteropServicesDllImport("User32dll", EntryPoint = "FindWindow")]
public static extern int FindWindow(string className, string titleName);
/// <summary>
/// 获取应用程序进程实例,如果没有匹配进程,返回Null
/// </summary>
/// <returns>返回当前Process实例</returns>
public static SystemDiagnosticsProcess GetRunningInstance()
{
//获取当前进程
SystemDiagnosticsProcess currentProcess = SystemDiagnosticsProcessGetCurrentProcess();
//获取当前运行程序完全限定名
string currentFileName = currentProcessMainModuleFileName;
//获取进程名为ProcessName的Process数组。
SystemDiagnosticsProcess[] processes = SystemDiagnosticsProcessGetProcessesByName(currentProcessProcessName);
//遍历有相同进程名称正在运行的进程
foreach (SystemDiagnosticsProcess process in processes)
{
if (processMainModuleFileName == currentFileName)
{
if (processId != currentProcessId)//根据进程ID排除当前进程
return process;//返回已运行的进程实例
}
}
return null;
}
/// <summary>
/// 获取应用程序句柄,设置应用程序前台运行,并返回bool值
/// </summary>
public static bool HandleRunningInstance(SystemDiagnosticsProcess instance)
{
IntPtr intPtr = new IntPtr(instanceMainWindowHandleToInt32() == 0
FindWindow(null, "Form1") : instanceMainWindowHandleToInt32());
//使窗口最大化
ShowWindowAsync(intPtr, WS_SHOWMAX);
//设置前台进程为已运行的进程,而现有进程继续执行至进程结束(在这里跑完MAIN函数就结束掉了)
return SetForegroundWindow(instanceMainWindowHandle);
}
/// <summary>
/// 获取窗口句柄,设置应用程序前台运行,并返回bool值,重载方法
/// </summary>
/// <returns></returns>
public static bool HandleRunningInstance()
{
SystemDiagnosticsProcess p = GetRunningInstance();
if (p != null)
{
HandleRunningInstance(p);
return true;
}
return false;
}
}
}
以上就是关于易语言怎么禁止重复运行,如果重复运行则d出已经在托盘运行的程序窗口全部的内容,包括:易语言怎么禁止重复运行,如果重复运行则d出已经在托盘运行的程序窗口、微信怎么多开、C# WinForm 程序如何只允许运行一个实例 等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)