微信 4.0 如何双开

如题。
微信 3.9 可以用批处理脚本直接双开,如下:

start /d "C:\Program Files (x86)\Tencent\WeChat" WeChat.exe
start /d "C:\Program Files (x86)\Tencent\WeChat" WeChat.exe

但是微信 4.0 使用以上脚本却无法实现双开,请教下各位大佬有没有双开的方法呢?

双开有风险吧

我微信工作号生活号分开的,双开有五年左右了,没什么事,一直正常用。

1 个赞

你现在是4.0哪个版本了?

现在电脑版微信有4.0了么?

官网有公测版

https://www.52pojie.cn/forum.php?mod=redirect&goto=findpost&ptid=1978410&pid=51637547

此帖很优雅,帖主用C++代码写了一个微信多开启动器,原理是从注册表中获取微信的安装路径,然后屏蔽掉互斥量来启动微信。最终成品大小 仅32.5 KB,且支持任意版本微信。但必须是安装版,而不是绿色版。

蓝奏地址:https://320nle.lanzouj.com/iF6Oc2ehrf6h

2 个赞

基于该贴主的方法,我尝试修改了以下代码,3.9启动没问题,但是4.0版本启动失效,只会将已经最小化的窗口还原 :rofl:

代码如下:

static bool getVxInstallPath(WCHAR* pathStr, double version)
{
	HKEY hKey;
	LPCWSTR keyPath;
	LONG openResult;

	if (version >= 4.0) {
		keyPath = _T("SOFTWARE\\Tencent\\Weixin");
	}
	else {
		keyPath = _T("SOFTWARE\\Tencent\\WeChat");
	}

	openResult = RegOpenKeyEx(HKEY_CURRENT_USER, keyPath, 0, KEY_ALL_ACCESS, &hKey);

	if (openResult == ERROR_SUCCESS) {
		DWORD valueSize = 4095;
		LONG queryResult = RegQueryValueEx(hKey, _T("InstallPath"), nullptr, nullptr, (LPBYTE)pathStr, &valueSize);
		if (queryResult == ERROR_SUCCESS) {
			RegCloseKey(hKey);
			return true;
		}
		else {
			::MessageBox(NULL, L"无法读取注册表值", L"提示", MB_OK);
		}
	}
	else {
		::MessageBox(NULL, L"无法打开注册表键", L"提示", MB_OK);
	}
	RegCloseKey(hKey);
	return false;
}

static void enableMultiWeChat()
{
	HANDLE hMutex = CreateMutexW(NULL, FALSE, L"_WeChat_App_Instance_Identity_Mutex_Name");
	SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
	PSID pEveryoneSID = NULL;
	char szBuffer[4096] = { 0 };
	PACL pAcl = (PACL)szBuffer;

	AllocateAndInitializeSid(&SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &pEveryoneSID);
	InitializeAcl(pAcl, sizeof(szBuffer), ACL_REVISION);
	AddAccessDeniedAce(pAcl, ACL_REVISION, MUTEX_ALL_ACCESS, pEveryoneSID);
	SetSecurityInfo(hMutex, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pAcl, NULL);
}


void CMultiWeiXin4Dlg::OnBnClickedButtonWx3()
{
	WCHAR WeChatPath[4096] = { 0 };
	size_t bufSize = 4096;

	if (getVxInstallPath(WeChatPath, 3.9)) {
		if (!wcscat_s(WeChatPath, bufSize, _T("\\WeChat.exe"))) {
			enableMultiWeChat();
			ShellExecute(NULL, NULL, WeChatPath, NULL, NULL, SW_NORMAL);
			return;
		}
	}
		
	MessageBox(_T("启动失败"));
}


void CMultiWeiXin4Dlg::OnBnClickedButtonWx4()
{
	WCHAR WeChatPath[4096] = { 0 };
	size_t bufSize = 4096;

	if (getVxInstallPath(WeChatPath, 4.0)) {
		if (!wcscat_s(WeChatPath, bufSize, _T("\\Weixin.exe"))) {
			enableMultiWeChat();
			ShellExecute(NULL, NULL, WeChatPath, NULL, NULL, SW_NORMAL);
			return;
		}
	}

	MessageBox(_T("启动失败"));
}

应该是这个互斥体对象不对,3.9 和 4.0 命名不一样,所以无法生效。

4.0版本已经不是用互斥体的方式了。

现在用的文件标识 lock.ini,手动的方法参考:

https://www.52pojie.cn/thread-1978410-1-2.html

1 个赞

如此简单,感谢! :anger: :100:

用sandboxie可以吗?