『取巧』VS2015试用期过后 继续试用
背景:
个人电脑 安装的 VS2015 Community 社区版。
一直用得挺好,都忘了要登录。
直到近来,30天试用期过 —— VS弹窗:要登录用户名、密码 才能继续使用。
但是,输入了无数次 邮箱,到下一步时,都弹出一个 白屏窗口 —— 死活没法登录成功。
登录不成功,日子还得过。
尊重著作权、版权 —— 破解VS这种事,还是不做的好(虽然能力可及)。
另辟蹊径:
试着通过 Win32 发送消息:关闭 弹出窗体。
但是 弹出窗体接收到 关闭消息后,整个VS 依然全部关掉了。
再尝试了一下:
如果先 修改系统时间,让修改后的系统时间 就是 试用期范围 —— 再关闭弹窗,VS 主窗体 没关闭。
思路明确:
> 监控系统所有窗体。
> 如果有窗体标题是 “Microsoft Visual Studio 帐户设置” 则开始 如下操作
> 修改系统时间 到 试用期范围。
> 发送 WM_CLOSE 消息,关闭 弹出窗体。
> 将系统时间 修改回来。
相关源码 150行:
- class Program
- {
- /// <summary>
- /// Visual Studio 2015 可以正常启用的 试用期 时间
- /// </summary>
- public static DateTime VisualStudioDate
- {
- get { return Convert.ToDateTime(ConfigurationManager.AppSettings["VisualStudioDate"] ?? "2018-05-01"); }
- }
- static void Main(string[] args)
- {
- while(true)
- {
- List<Win32API.WindowInfo> list = Win32API.EnumWindows();
- List<Win32API.WindowInfo> list2 = list.FindAll(x => x.szWindowName == "Microsoft Visual Studio 帐户设置");
- if (list2.Count >= )
- {
- //将系统时间设置为 可试用期
- DateTime nowTime = DateTime.Now;
- DateTime vsTime = VisualStudioDate;
- double timeSpanMS = (nowTime - vsTime).TotalMilliseconds;
- Win32API.SetSystemTime(vsTime);
- foreach (Win32API.WindowInfo item in list2)
- {
- try
- {
- Console.WriteLine(string.Format("即将关闭 \"{0}\" 0x{1}", item.szWindowName, item.hWnd.ToString("X8")));
- Win32API.SendMessage(item.hWnd, Win32API.WM_CLOSE, , );
- }
- catch { }
- }
- Thread.Sleep();
- //将系统时间还原为 实际日期
- DateTime nowTime2 = DateTime.Now;
- double timeSpanMS2 = (nowTime2 - vsTime).TotalMilliseconds;
- DateTime realTime = vsTime.AddMilliseconds(timeSpanMS + timeSpanMS2);
- Win32API.SetSystemTime(realTime);
- }
- //死循环, 休眠5秒
- Thread.Sleep();
- }
- }
- }
- public class Win32API
- {
- public const int WM_CLOSE = 0x0010;
- private delegate bool WNDENUMPROC(IntPtr hWnd, int lParam);
- [DllImport("User32.dll", EntryPoint = "SendMessage")]
- public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
- #region 获取所有窗体句柄
- //Copyright © http://www.cnblogs.com/oraclejava/articles/1549025.html
- [DllImport("user32.dll")]
- private static extern bool EnumWindows(WNDENUMPROC lpEnumFunc, int lParam);
- [DllImport("user32.dll")]
- private static extern int GetWindowTextW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);
- [DllImport("user32.dll")]
- private static extern int GetClassNameW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);
- public struct WindowInfo
- {
- public IntPtr hWnd;
- public string szWindowName;
- public string szClassName;
- public override string ToString()
- {
- return "0x" + hWnd.ToString("X8") + " '" + szWindowName + "' '" + szClassName + "'";
- }
- }
- public static List<WindowInfo> EnumWindows()
- {
- List<WindowInfo> wndList = new List<WindowInfo>();
- EnumWindows(delegate(IntPtr hWnd, int lParam)
- {
- WindowInfo wnd = new WindowInfo();
- StringBuilder sb = new StringBuilder();
- wnd.hWnd = hWnd;
- GetWindowTextW(hWnd, sb, sb.Capacity);
- wnd.szWindowName = sb.ToString();
- GetClassNameW(hWnd, sb, sb.Capacity);
- wnd.szClassName = sb.ToString();
- wndList.Add(wnd);
- return true;
- }, );
- return wndList;
- }
- #endregion
- #region 操作系统 时间修改
- public static bool SetSystemTime(DateTime newDateTime)
- {
- SystemTime sysTime = new SystemTime();
- sysTime.wYear = Convert.ToUInt16(newDateTime.Year);
- sysTime.wMonth = Convert.ToUInt16(newDateTime.Month);
- sysTime.wDay = Convert.ToUInt16(newDateTime.Day);
- sysTime.wHour = Convert.ToUInt16(newDateTime.Hour);
- sysTime.wMinute = Convert.ToUInt16(newDateTime.Minute);
- sysTime.wSecond = Convert.ToUInt16(newDateTime.Second);
- sysTime.wMiliseconds = (ushort)newDateTime.Millisecond;
- return SystemDateTime.SetLocalTime(ref sysTime);
- }
- private class SystemDateTime
- {
- [DllImport("Kernel32.dll")]
- public static extern bool SetLocalTime(ref SystemTime sysTime);
- [DllImport("Kernel32.dll")]
- public static extern void GetLocalTime(ref SystemTime sysTime);
- }
- [StructLayout(LayoutKind.Sequential)]
- private struct SystemTime
- {
- public ushort wYear;
- public ushort wMonth;
- public ushort wDayOfWeek;
- public ushort wDay;
- public ushort wHour;
- public ushort wMinute;
- public ushort wSecond;
- public ushort wMiliseconds;
- }
- #endregion
- }
项目编译:
新建一个 WinForm 程序。
将上面的代码 复制替换。
编译之后,将 exe 创建一个 快捷方式,放到 “启动” 菜单中,开机就启动,让exe在后台运行即可。
操作争议:
作者非常尊重 软件著作权、版权 —— 无意伤害微软利益。
用这种方式 延长试用,似乎有两个争议:修改系统时间、发送 WM_CLOSE 消息。
> 修改系统时间 是一种 普通操作,任何人都可以进行。【不具备争议性】
> 发送 WM_CLOSE 消息,一个程序给另一个程序发送消息,改变另外的程序的行为【有点外挂的味道】。 —— 但仔细一想:电脑关机时,系统会给每一个程序 都发送 WM_CLOSE 消息。这样一想,就突然不觉得侵权了。
尊重知识产权:
作者非常尊重 软件著作权、版权 —— 如果本文的操作 损害了 微软的利益,请及时联系作者,删除、修改 此文。
『取巧』VS2015试用期过后 继续试用的更多相关文章
- 『Python』VS2015编译源码注意事项
一.2.5.6版本源码编译 解压 Python-2.5.6.tgz 进入 Pcbuild8 文件夹,使用 vs 2013 打开 pybuild.sln (vs 解决方案),进入 vs2015IDE 环 ...
- 『设计』Laura.Compute 设计思路
前言: 前一篇文章 <『开源』也顺手写一个 科学计算器:重磅开源> ,继 Laura.Compute 算法开源之后,有 博客园 园友 希望公开一下 Laura.Compute算法 的 设计 ...
- 『AngularJS』$location 服务
项目中关于 $location的用法 简介 $location服务解析在浏览器地址栏中的URL(基于window.location)并且让URL在你的应用中可用.改变在地址栏中的URL会作用到$loc ...
- [原创] 【2014.12.02更新网盘链接】基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装
[原创] [2014.12.02更新网盘链接]基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装 joinlidong 发表于 2014-11-29 14:25:50 ...
- JS 中通过对象关联实现『继承』
JS 中继承其实是种委托,而不是传统面向对象中的复制父类到子类,只是通过原型链将要做的事委托给父类. 下面介绍通过对象关联来实现『继承』的方法: Foo = { // 需要提供一个 init 方法来初 ...
- 『摄影欣赏』16幅 Romantic 风格照片欣赏【组图】
今天,我们将继续分享人类情感的系列文章.爱是人类最重要的感觉,也可能是各种形式的艺术(电影,音乐,书,画等)最常表达的主题 .这里有40个最美丽的爱的照片,将激励和给你一个全新的视觉角度为这种情绪.我 ...
- 『开源』Slithice 2013 服务器集群 设计和源码
相关介绍文章: <『设计』Slithice 分布式架构设计-支持一体式开发,分布式发布> <『集群』001 Slithice 服务器集群 概述> <『集群』002 Sli ...
- 『片段』OracleHelper (支持 多条SQL语句)
C# 调用 Oracle 是如此尴尬 >System.Data.OracleClient.dll —— .Net 自带的 已经 过时作废. >要链接 Oracle 服务器,必须在 本机安装 ...
- 『设计』Slithice 分布式架构设计-支持一体式开发,分布式发布
项目原因: 参与过各种 分布式项目,有 Socket,Remoting,WCF,当然还有最常用的可以跨平台的 WebService. 分布式编码的时间浪费: 但是,无一例外的,开发分布式程序的开发遵循 ...
随机推荐
- 发布 Rafy .NET Standard 版本 Nuget 包
去年年中,Rafy 框架的源码就已经支持了 Net Standard 2.0 版本.其开源代码也已经上传到 Github 中:https://github.com/zgynhqf/rafy/tree/ ...
- JDK及JRE目录结构
JDK文件结构及目录: c:\jdk1.7.0: JDK安装根目录,包括版权.许可证和READEME文件,还包含ser.zip记录Java平台档案. c:\jdk1.7.0\bin 包含在Java开发 ...
- C++ 利用流来进行string和其他类的转换
通过这种方法可以实现任意转换,需要头文件 #include<string> #include<sstream> 期中sstream提供了我们的主角string流,下面给出int ...
- Python_二叉树
BinaryTree.py '''二叉树:是每个节点最多有两个子树(分别称为左子树和右子树)的树结构,二叉树的第i层最多有2**(i-1)个节点,常用于排序或查找''' class BinaryTre ...
- linux定时任务cron配置
实现linux定时任务有:cron.anacron.at,使用最多的是cron任务 名词解释 cron--服务名:crond--linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与 ...
- SIMATIC_STEP_V5.6使用报错
SIMATIC_STEP_V5.6是西门子出来的一款能够在Windows 10上运行的step 7软件. 正常的安装步骤我们可以在百度上面进行一些查找,在这里我将我遇到的一个问题发出来. 在Windo ...
- 整合 ucenter 注册自动激活
http://my.oschina.net/banbo/blog/311691 应用整合 UCenter,同步注册到 Discuz 的用户,在 Discuz 登录时得手动激活,用户体验很不好,不过解决 ...
- 运行yum时出现/var/run/yum.pid已被锁定,PID为xxxx的另一个程序正在运行的问题解决
出现问题 [root@localhost ~]#yum update 已加载插件: fastestmirror,security /var/run/yum.pid已被锁定,PID为1610的另一个程序 ...
- 图片和base64相互转化
# -*- coding: utf-8 -*- import urllib2 as ulb import base64 #用urllib2库链接网络图像 response=ulb.Request('h ...
- java函数式编程之Consumer
参考https://blog.csdn.net/z345434645/article/details/53794724 https://blog.csdn.net/chuji2012/article/ ...