易语言怎么禁止重复运行,如果重复运行则d出已经在托盘运行的程序窗口

易语言怎么禁止重复运行,如果重复运行则d出已经在托盘运行的程序窗口,第1张

创建一个 互斥体 ,其它判断都是不最理想的,而且创建互斥体也就几个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 程序如何只允许运行一个实例 等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10206692.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-06
下一篇2023-05-06

发表评论

登录后才能评论

评论列表(0条)

    保存