微信多开,微信多开小助手,电脑版微信多开小工具

因为经常需要一台电脑同时登陆多个微信,然而腾讯并不允许微信多开,搞得很不方便。

网上的方案一般是通过批处理,同时启动多个微信再分别登陆。比如下面的*.bat文件代码:

 

  1. @echo off
  2. start “” “C:\Program Files (x86)\Tencent\WeChat\WeChat.exe”
  3. start “” “C:\Program Files (x86)\Tencent\WeChat\WeChat.exe”
  4. exit

复制代码

 

实际上,一旦登陆了微信,再用这种方法就失效了。只能退出微信再重新登陆,很不方便。
1、程序员都知道,所谓的程序单开是通过Mutex互斥体实现的,只要杀掉这个互斥体,就可以实现程序的多开。

2、论坛里大多微信多开工具都是用微软的句柄工具handle关闭微信互斥体实例,因此需要释放文件到临时目录;本工具将此功能完全重写,无需释放文件。

3、本工具不易失效,支持批量多开、开机自启,只要内存够大,多开多少都 OK。

4、Windows微信多开助手使用纯VC++编写,支持最新微信2023所有版本都可使用。

  1. // multiWechatDlg.cpp: 实现文件
  2. //
  3. #include “pch.h”
  4. #include “framework.h”
  5. #include “multiWechat.h”
  6. #include “multiWechatDlg.h”
  7. #include “afxdialogex.h”
  8. #include <aclapi.h>
  9. #include <shlwapi.h>
  10. #pragma comment(lib,”Shlwapi.lib”)
  11. #ifdef _DEBUG
  12. #define new DEBUG_NEW
  13. #endif
  14. // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
  15. class CAboutDlg : public CDialogEx
  16. {
  17. public:
  18.         CAboutDlg();
  19. // 对话框数据
  20. #ifdef AFX_DESIGN_TIME
  21.         enum { IDD = IDD_ABOUTBOX };
  22. #endif
  23.         protected:
  24.         virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
  25. // 实现
  26. protected:
  27.         DECLARE_MESSAGE_MAP()
  28. };
  29. CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
  30. {
  31. }
  32. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  33. {
  34.         CDialogEx::DoDataExchange(pDX);
  35. }
  36. BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
  37. END_MESSAGE_MAP()
  38. // CmultiWechatDlg 对话框
  39. CmultiWechatDlg::CmultiWechatDlg(CWnd* pParent /*=nullptr*/)
  40.         : CDialogEx(IDD_MULTIWECHAT_DIALOG, pParent)
  41. {
  42.         m_hIcon = AfxGetApp()->LoadIcon(IDR_WECHAT);
  43. }
  44. void CmultiWechatDlg::DoDataExchange(CDataExchange* pDX)
  45. {
  46.         CDialogEx::DoDataExchange(pDX);
  47.         DDX_Control(pDX, IDC_CHECK_AUTOSTART, m_autoStart);
  48. }
  49. BEGIN_MESSAGE_MAP(CmultiWechatDlg, CDialogEx)
  50.         ON_WM_SYSCOMMAND()
  51.         ON_WM_PAINT()
  52.         ON_WM_QUERYDRAGICON()
  53.         ON_BN_CLICKED(IDC_BTN_STAR, &CmultiWechatDlg::StartWechat)
  54.         ON_WM_DESTROY()
  55.         ON_COMMAND(ID_ALL_EXIT, &CmultiWechatDlg::OnAllExit)
  56.         ON_BN_CLICKED(IDC_CHECK_AUTOSTART, &CmultiWechatDlg::OnBnClickedCheckAutostart)
  57.         ON_WM_CTLCOLOR()
  58.         //ON_EN_CHANGE(IDC_EDIT1, &CmultiWechatDlg::OnEnChangeEdit1)
  59. END_MESSAGE_MAP()
  60. // CmultiWechatDlg 消息处理程序
  61. void OutPutString(LPCWSTR strFormat, …)
  62. {
  63.         if (NULL == strFormat)
  64.         {
  65.                 return;
  66.         }
  67.         TCHAR strInfo[4096] = { 0 };
  68.         va_list arg_ptr = NULL;
  69.         va_start(arg_ptr, strFormat);
  70.         vswprintf_s(strInfo, 4096, strFormat, arg_ptr);
  71.         va_end(arg_ptr);
  72.         OutputDebugString(strInfo);
  73. }
  74. typedef BOOL(WINAPI* LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
  75. LPFN_ISWOW64PROCESS fnIsWow64Process;
  76. BOOL IsWow64()
  77. {
  78.         BOOL bIsWow64 = FALSE;
  79.         fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle(TEXT(“kernel32”)),
  80.                 “IsWow64Process”);
  81.         if (NULL != fnIsWow64Process)
  82.         {
  83.                 if (!fnIsWow64Process(GetCurrentProcess(), &bIsWow64))
  84.                 {
  85.                         return TRUE;
  86.                 }
  87.         }
  88.         return bIsWow64;
  89. }
  90. void EnableMultiWeChat()
  91. {
  92.         HANDLE hMutex = CreateMutexW(NULL, FALSE, L”_WeChat_App_Instance_Identity_Mutex_Name”);
  93.         SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
  94.         PSID pEveryoneSID = NULL;
  95.         char szBuffer[4096] = {0};
  96.         PACL pAcl = (PACL)szBuffer;
  97.         AllocateAndInitializeSid(
  98.                 &SIDAuthWorld,
  99.                 1,
  100.                 SECURITY_WORLD_RID,
  101.                 0, 0, 0, 0, 0, 0, 0,
  102.                 &pEveryoneSID);
  103.         InitializeAcl(pAcl, sizeof(szBuffer), ACL_REVISION);
  104.         AddAccessDeniedAce(pAcl, ACL_REVISION, MUTEX_ALL_ACCESS, pEveryoneSID);
  105.         SetSecurityInfo(hMutex, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pAcl, NULL);
  106. }
  107. CString ReadRegValue(
  108.         _In_ HKEY hKey,
  109.         _In_opt_ LPCWSTR lpSubKey,
  110.         _In_opt_ LPCWSTR lpValueName,
  111.         DWORD *pdwTpye)
  112. {
  113.         HKEY hHandle = nullptr;
  114.         if (ERROR_SUCCESS != RegOpenKeyEx(hKey, lpSubKey, 0, KEY_READ, &hHandle))
  115.         {
  116.                 return L””;
  117.         }
  118.         DWORD dwValue = MAX_PATH;
  119.         TCHAR szWechatPath[MAX_PATH + 1] = { 0 };
  120.         if (ERROR_SUCCESS != RegQueryValueEx(hHandle, lpValueName, 0, pdwTpye, (LPBYTE)szWechatPath, &dwValue))
  121.         {
  122.                 CloseHandle(hHandle);
  123.                 return L””;
  124.         }
  125.         CloseHandle(hHandle);
  126.         return CString(szWechatPath);
  127. }
  128. void DeleteRegValue(
  129.         _In_ HKEY hKey,
  130.         _In_opt_ LPCWSTR lpSubKey,
  131.         _In_opt_ LPCWSTR lpValueName)
  132. {
  133.         HKEY hHandle = nullptr;
  134.         if (ERROR_SUCCESS != RegOpenKeyEx(hKey, lpSubKey, 0, KEY_ALL_ACCESS, &hHandle))
  135.         {
  136.                 return;
  137.         }
  138.         if (ERROR_SUCCESS != RegDeleteValue(hHandle, lpValueName))
  139.         {
  140.                 AfxMessageBox(L”注册表删除失败!”);
  141.         }
  142.         CloseHandle(hHandle);
  143. }
  144. void WriteRegValue(
  145.         _In_ HKEY hKey,
  146.         _In_opt_ LPCWSTR lpSubKey,
  147.         _In_opt_ LPCWSTR lpValueName,
  148.         _In_opt_ DWORD      dwType,
  149.         _In_opt_ const BYTE* lpData,
  150.         _In_opt_ DWORD      cbData
  151.         )
  152. {
  153.         HKEY hHandle = nullptr;
  154.         if (ERROR_SUCCESS != RegOpenKeyEx(hKey, lpSubKey, 0, KEY_ALL_ACCESS, &hHandle))
  155.         {
  156.                 return;
  157.         }
  158.         if (ERROR_SUCCESS != RegSetValueEx(hHandle, lpValueName, 0, dwType, lpData, cbData))
  159.         {
  160.                 AfxMessageBox(L”注册表写入失败!”);
  161.         }
  162.         RegFlushKey(hHandle);
  163.         CloseHandle(hHandle);
  164. }
  165. void CmultiWechatDlg::LoadWechatPath()
  166. {
  167.         DWORD dwTpye = 0;
  168.         if (IsWow64()) {
  169.                 m_strWechatPath = ReadRegValue(
  170.                         HKEY_LOCAL_MACHINE,
  171.                         TEXT(“SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\WeChat”),
  172.                         TEXT(“DisplayIcon”),
  173.                         &dwTpye);
  174.         }
  175.         else {
  176.                 m_strWechatPath = ReadRegValue(
  177.                         HKEY_LOCAL_MACHINE,
  178.                         TEXT(“SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\WeChat”),
  179.                         TEXT(“DisplayIcon”),
  180.                         &dwTpye);
  181.         }
  182.         m_strWechatPath.TrimLeft(L”””);
  183.         m_strWechatPath.TrimRight(L”””);
  184. }
  185. void CmultiWechatDlg::OpenWechat()
  186. {
  187.         if (!PathFileExists(m_strWechatPath)) {
  188.                 AfxMessageBox(TEXT(“本机微信未安装!”));
  189.         }
  190.         else {
  191.                 ShellExecute(NULL, TEXT(“open”), m_strWechatPath, NULL, NULL, SW_SHOWNORMAL);
  192.         }
  193. }
  194. void CmultiWechatDlg::StartWechat()
  195. {
  196.         //IDC_EDIT1.GetWindowText(MoreOpenNum_str);
  197.         GetDlgItem(IDC_EDIT1)->GetWindowText(MoreOpenNum_str);
  198.         MoreOpenNum = _ttoi(MoreOpenNum_str);
  199.         for (int i = 1; i <= MoreOpenNum; i++)
  200.         {
  201.                 OpenWechat();
  202.         }
  203. }
  204. void CmultiWechatDlg::CheckAutoStart()
  205. {
  206.         DWORD dwTpye = 0;
  207.         CString strStartString;
  208.         if (IsWow64())
  209.         {
  210.                 strStartString = ReadRegValue(
  211.                         HKEY_LOCAL_MACHINE,
  212.                         TEXT(“SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Run\”),
  213.                         TEXT(“MultiWechat”),
  214.                         &dwTpye);
  215.         }
  216.         else
  217.         {
  218.                 strStartString = ReadRegValue(
  219.                         HKEY_LOCAL_MACHINE,
  220.                         TEXT(“SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\”),
  221.                         TEXT(“MultiWechat”),
  222.                         &dwTpye);
  223.         }
  224.         if (strStartString.GetLength() > 0) {
  225.                 m_autoStart.SetCheck(1);
  226.         }
  227. }
  228. BOOL CmultiWechatDlg::OnInitDialog()
  229. {
  230.         CDialogEx::OnInitDialog();
  231.         // 将“关于…”菜单项添加到系统菜单中。
  232.         // IDM_ABOUTBOX 必须在系统命令范围内。
  233.         ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  234.         ASSERT(IDM_ABOUTBOX < 0xF000);
  235.         CMenu* pSysMenu = GetSystemMenu(FALSE);
  236.         if (pSysMenu != nullptr)
  237.         {
  238.                 BOOL bNameValid;
  239.                 CString strAboutMenu;
  240.                 bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  241.                 ASSERT(bNameValid);
  242.                 if (!strAboutMenu.IsEmpty())
  243.                 {
  244.                         pSysMenu->AppendMenu(MF_SEPARATOR);
  245.                         pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  246.                 }
  247.         }
  248.         // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
  249.         //  执行此操作
  250.         SetIcon(m_hIcon, TRUE);                        // 设置大图标
  251.         SetIcon(m_hIcon, FALSE);                // 设置小图标
  252.         //ShowWindow(SW_MINIMIZE);
  253.         // TODO: 在此添加额外的初始化代码
  254.         EnableMultiWeChat();
  255.         CheckAutoStart();
  256.         LoadWechatPath();
  257.         m_notifyIcon.cbSize = sizeof(NOTIFYICONDATA);
  258.         m_notifyIcon.hIcon = m_hIcon;
  259.         m_notifyIcon.hWnd = m_hWnd;
  260.         lstrcpy(m_notifyIcon.szTip, _T(“微信多开助手”));
  261.         m_notifyIcon.uCallbackMessage = WM_SYSTEMTRAY;
  262.         m_notifyIcon.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
  263.         Shell_NotifyIcon(NIM_ADD, &m_notifyIcon);
  264. ;
  265.         int nArgs;
  266.         LPWSTR* szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
  267.         if (nArgs >= 2)
  268.         {
  269.                 for (size_t i = 0; i < nArgs; i++)
  270.                 {
  271.                         if (lstrcmpW(szArglist[1], L”-background”) == 0) {
  272.                                 PostMessage(WM_SYSCOMMAND, SC_MINIMIZE, 0);
  273.                                 break;
  274.                         }
  275.                 }
  276.         }
  277.         LocalFree(szArglist);
  278.         return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
  279. }
  280. void CmultiWechatDlg::OnSysCommand(UINT nID, LPARAM lParam)
  281. {
  282.         if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  283.         {
  284.                 CAboutDlg dlgAbout;
  285.                 dlgAbout.DoModal();
  286.         }
  287.         else
  288.         {
  289.                 CDialogEx::OnSysCommand(nID, lParam);
  290.         }
  291. }
  292. // 如果向对话框添加最小化按钮,则需要下面的代码
  293. //  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
  294. //  这将由框架自动完成。
  295. void CmultiWechatDlg::OnPaint()
  296. {
  297.         if (IsIconic())
  298.         {
  299.                 CPaintDC dc(this); // 用于绘制的设备上下文
  300.                 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  301.                 // 使图标在工作区矩形中居中
  302.                 int cxIcon = GetSystemMetrics(SM_CXICON);
  303.                 int cyIcon = GetSystemMetrics(SM_CYICON);
  304.                 CRect rect;
  305.                 GetClientRect(&rect);
  306.                 int x = (rect.Width() – cxIcon + 1) / 2;
  307.                 int y = (rect.Height() – cyIcon + 1) / 2;
  308.                 // 绘制图标
  309.                 dc.DrawIcon(x, y, m_hIcon);
  310.         }
  311.         else
  312.         {
  313.                 CDialogEx::OnPaint();
  314.         }
  315. }
  316. //当用户拖动最小化窗口时系统调用此函数取得光标
  317. //显示。
  318. HCURSOR CmultiWechatDlg::OnQueryDragIcon()
  319. {
  320.         return static_cast<HCURSOR>(m_hIcon);
  321. }
  322. void CmultiWechatDlg::OnDestroy()
  323. {
  324.         CDialogEx::OnDestroy();
  325.         Shell_NotifyIcon(NIM_DELETE, &m_notifyIcon);
  326. }
  327. LRESULT CmultiWechatDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  328. {
  329.         // TODO: 在此添加专用代码和/或调用基类
  330.         switch (message) {
  331.         case WM_SYSTEMTRAY:
  332.                 if (lParam == WM_LBUTTONDBLCLK)
  333.                 {
  334.                         if (AfxGetApp()->m_pMainWnd->IsWindowVisible())
  335.                         {
  336.                                 AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE);
  337.                         }
  338.                         else
  339.                         {
  340.                                 AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW);
  341.                                 CenterWindow();
  342.                         }
  343.                 }
  344.                 else if (lParam == WM_RBUTTONDOWN)
  345.                 {
  346.                         CMenu menu;
  347.                         menu.LoadMenu(IDR_MENU_EXIT);
  348.                         CMenu* pMenu = menu.GetSubMenu(0);
  349.                         CPoint pos;
  350.                         GetCursorPos(&pos);
  351.                         pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pos.x, pos.y, AfxGetMainWnd());
  352.                 }
  353.                 break;
  354.         case WM_DESTROY:
  355.                 ::Shell_NotifyIcon(NIM_DELETE, &m_notifyIcon);
  356.                 break;
  357.         case WM_SYSCOMMAND:
  358.                 if (wParam == SC_MINIMIZE)
  359.                 {
  360.                         AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE);
  361.                         return 0;
  362.                 }
  363.                 break;
  364.         }
  365.         return CDialogEx::WindowProc(message, wParam, lParam);
  366. }
  367. void CmultiWechatDlg::OnAllExit()
  368. {
  369.         PostMessage(WM_QUIT, 0, 0);
  370. }
  371. void CmultiWechatDlg::OnBnClickedCheckAutostart()
  372. {
  373.         CString strKey = TEXT(“SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Run\”);
  374.         if (!IsWow64()) {
  375.                 strKey = TEXT(“SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\”);
  376.         }
  377.         CString strItemName = TEXT(“MultiWechat”);
  378.         if (m_autoStart.GetCheck()) {
  379.                 TCHAR szPath[MAX_PATH + 1] = { 0 };
  380.                 GetModuleFileName(NULL, szPath, MAX_PATH);
  381.                 CString strPath;
  382.                 strPath.Format(L””%s” -background”, szPath);
  383.                 WriteRegValue(
  384.                         HKEY_LOCAL_MACHINE,
  385.                         strKey,
  386.                         strItemName,
  387.                         REG_SZ,
  388.                         (const BYTE*)strPath.GetBuffer(0),
  389.                         strPath.GetLength() * 2);
  390.                 strPath.ReleaseBuffer();
  391.         }
  392.         else {
  393.                 DeleteRegValue(
  394.                         HKEY_LOCAL_MACHINE,
  395.                         strKey,
  396.                         strItemName);
  397.         }
  398. }
  399. HBRUSH CmultiWechatDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  400. {
  401.         HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
  402.         if (pWnd->GetDlgCtrlID() == IDC_TIPS)
  403.         {
  404.                 pDC->SetTextColor(RGB(255, 0, 0));
  405.         }
  406.         return hbr;
  407. }

复制代码

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请不要用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性

后期咖 » 微信多开,微信多开小助手,电脑版微信多开小工具

常见问题FAQ

免费下载或者VIP会员专享资源能否直接商用?
本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
提示下载完但解压或打开不了?
最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。 若排除这种情况,可在对应资源底部留言,或 联络我们.。
你们有qq群吗怎么加入?
当然有的,如果你是帝国cms、易优cms、和pbootcms系统的爱好者你可以加入我们的QQ千人交流群https://www.saiker.net/page-qun.html。
  • 1483会员数(个)
  • 453资源数(个)
  • 0本周更新(个)
  • 0 今日更新(个)
  • 870稳定运行(天)

后期咖

立即查看 了解详情
开通VIP 享更多特权,建议使用 QQ 登录