背景:

个人电脑 安装的 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试用期过后 继续试用的更多相关文章

  1. 『Python』VS2015编译源码注意事项

    一.2.5.6版本源码编译 解压 Python-2.5.6.tgz 进入 Pcbuild8 文件夹,使用 vs 2013 打开 pybuild.sln (vs 解决方案),进入 vs2015IDE 环 ...

  2. 『设计』Laura.Compute 设计思路

    前言: 前一篇文章 <『开源』也顺手写一个 科学计算器:重磅开源> ,继 Laura.Compute 算法开源之后,有 博客园 园友 希望公开一下 Laura.Compute算法 的 设计 ...

  3. 『AngularJS』$location 服务

    项目中关于 $location的用法 简介 $location服务解析在浏览器地址栏中的URL(基于window.location)并且让URL在你的应用中可用.改变在地址栏中的URL会作用到$loc ...

  4. [原创] 【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 ...

  5. JS 中通过对象关联实现『继承』

    JS 中继承其实是种委托,而不是传统面向对象中的复制父类到子类,只是通过原型链将要做的事委托给父类. 下面介绍通过对象关联来实现『继承』的方法: Foo = { // 需要提供一个 init 方法来初 ...

  6. 『摄影欣赏』16幅 Romantic 风格照片欣赏【组图】

    今天,我们将继续分享人类情感的系列文章.爱是人类最重要的感觉,也可能是各种形式的艺术(电影,音乐,书,画等)最常表达的主题 .这里有40个最美丽的爱的照片,将激励和给你一个全新的视觉角度为这种情绪.我 ...

  7. 『开源』Slithice 2013 服务器集群 设计和源码

    相关介绍文章: <『设计』Slithice 分布式架构设计-支持一体式开发,分布式发布> <『集群』001 Slithice 服务器集群 概述> <『集群』002 Sli ...

  8. 『片段』OracleHelper (支持 多条SQL语句)

    C# 调用 Oracle 是如此尴尬 >System.Data.OracleClient.dll —— .Net 自带的 已经 过时作废. >要链接 Oracle 服务器,必须在 本机安装 ...

  9. 『设计』Slithice 分布式架构设计-支持一体式开发,分布式发布

    项目原因: 参与过各种 分布式项目,有 Socket,Remoting,WCF,当然还有最常用的可以跨平台的 WebService. 分布式编码的时间浪费: 但是,无一例外的,开发分布式程序的开发遵循 ...

随机推荐

  1. unity零基础开始学习做游戏(六)背景给我“滚”~

    -------小基原创,转载请给我一个面子 一望无际的...空旷场景,看着实在是难受,不如添加些背景吧.如果要真的想好好设计关卡背景的话,最好是做一个地图编辑器,不过做开发工具毕竟有点点复杂且枯燥,以 ...

  2. kaggle入门项目:Titanic存亡预测 (一)比赛简介

    自从入了数据挖掘的坑,就在不停的看视频刷书,但是总觉得实在太过抽象,在结束了coursera上Andrew Ng 教授的机器学习课程还有刷完一整本集体智慧编程后更加迷茫了,所以需要一个实践项目来扎实之 ...

  3. UE4学习心得:蓝图间信息通信的几种方法

    蓝图间通信是一个复杂关卡能否正常运行的关键,笔者在这里提供几种蓝图类之间的信息交互方法,希望能对读者有所帮助. 1.类引用 这是最直接的一种蓝图类之间的信息交互方式.首先在Editor中创建2个Act ...

  4. 部署网站: 配置项目到iis上运行报目录错误

    配置项目到iis上运行报目录错误 以下三种方法可使用: 1.添加文件访问权限 everyone  (线上环境慎用) 2.重新注册iis 3.web.config 加一段话 在<system.we ...

  5. DevOps之五 Tomcat的安装与配置

    安装说明 安装环境:CentOS-7 安装方式:源码安装 软件:apache-tomcat-9 下载地址:https://tomcat.apache.org/download-90.cgi 一.安装t ...

  6. hadoop HA 详解

    NameNode 高可用整体架构概述 在 Hadoop 1.0 时代,Hadoop 的两大核心组件 HDFS NameNode 和 JobTracker 都存在着单点问题,这其中以 NameNode ...

  7. Android 开发TCP协议时,报错NetworkOnMainThreadException

    设想是通过Android应用连接PC的TCP服务器,通过点击按钮连接服务器, 最终在点击按钮后报错:networkonmainthreadexception 解决办法: 在MainActivity文件 ...

  8. 学习Android过程中的一些博客或工具收集

    android studio中使用SlidingMenu: 超简单Android Studio导入第三方库(SlidingMenu)教程绝对傻瓜版 android 更新sdk23以后,报错提示Floa ...

  9. Docker 跨主机网络方案分析

    PS:文章首发公众号,欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. 上篇文章介绍了容器网络的单主机网络,本文将进一步介绍多 ...

  10. Oracle-06:DML语言数据表的操作

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 开篇放上一个SQL脚本,供测试使用 create table DEPT ( deptno ) not null ...