『取巧』VS2015試用期過後 繼續試用

来源:https://www.cnblogs.com/shuxiaolong/archive/2018/05/22/VS_Extended_Probationary_Periods.html
-Advertisement-
Play Games

背景: 個人電腦 安裝的 VS2015 Community 社區版。 一直用得挺好,都忘了要登錄。 直到近來,30天試用期過 —— VS彈窗:要登錄用戶名、密碼 才能繼續使用。 但是,輸入了無數次 郵箱,到下一步時,都彈出一個 白屏視窗 —— 死活沒法登錄成功。 登錄不成功,日子還得過。 尊重著作權 ...


背景:

個人電腦 安裝的 VS2015 Community 社區版。

一直用得挺好,都忘了要登錄。

 

直到近來,30天試用期過 —— VS彈窗:要登錄用戶名、密碼 才能繼續使用。

但是,輸入了無數次 郵箱,到下一步時,都彈出一個 白屏視窗 —— 死活沒法登錄成功。

 

登錄不成功,日子還得過。

尊重著作權、版權 —— 破解VS這種事,還是不做的好(雖然能力可及)。

 

另闢蹊徑:

試著通過 Win32 發送消息:關閉 彈出窗體。

但是 彈出窗體接收到 關閉消息後,整個VS 依然全部關掉了。

再嘗試了一下:

如果先 修改系統時間,讓修改後的系統時間 就是 試用期範圍 —— 再關閉彈窗,VS 主窗體 沒關閉。

 

思路明確:

> 監控系統所有窗體。

> 如果有窗體標題是 “Microsoft Visual Studio 帳戶設置” 則開始 如下操作

> 修改系統時間 到 試用期範圍。

> 發送 WM_CLOSE 消息,關閉 彈出窗體。

> 將系統時間 修改回來。

 

相關源碼 150行:

  1     class Program
  2     {
  3         /// <summary>
  4         /// Visual Studio 2015 可以正常啟用的 試用期 時間
  5         /// </summary>
  6         public static DateTime VisualStudioDate
  7         {
  8             get { return Convert.ToDateTime(ConfigurationManager.AppSettings["VisualStudioDate"] ?? "2018-05-01"); }
  9         }
 10 
 11 
 12 
 13         static void Main(string[] args)
 14         {
 15             while(true)
 16             {
 17                 List<Win32API.WindowInfo> list = Win32API.EnumWindows();
 18                 List<Win32API.WindowInfo> list2 = list.FindAll(x => x.szWindowName == "Microsoft Visual Studio 帳戶設置");
 19 
 20                 if (list2.Count >= 1)
 21                 {
 22                     //將系統時間設置為 可試用期
 23                     DateTime nowTime = DateTime.Now;
 24                     DateTime vsTime = VisualStudioDate;
 25                     double timeSpanMS = (nowTime - vsTime).TotalMilliseconds;
 26                     Win32API.SetSystemTime(vsTime);
 27 
 28                     foreach (Win32API.WindowInfo item in list2)
 29                     {
 30                         try
 31                         {
 32                             Console.WriteLine(string.Format("即將關閉 \"{0}\" 0x{1}", item.szWindowName, item.hWnd.ToString("X8")));
 33                             Win32API.SendMessage(item.hWnd, Win32API.WM_CLOSE, 0, 0);
 34                         }
 35                         catch { }
 36                     }
 37 
 38                     Thread.Sleep(2000);
 39 
 40                     //將系統時間還原為 實際日期
 41                     DateTime nowTime2 = DateTime.Now;
 42                     double timeSpanMS2 = (nowTime2 - vsTime).TotalMilliseconds;
 43                     DateTime realTime = vsTime.AddMilliseconds(timeSpanMS + timeSpanMS2);
 44                     Win32API.SetSystemTime(realTime);
 45                 }
 46 
 47                 //死迴圈, 休眠5秒
 48                 Thread.Sleep(5000);
 49             }
 50         }
 51 
 52 
 53 
 54 
 55     }
 56 
 57     public class Win32API
 58     {
 59         public const int WM_CLOSE = 0x0010;
 60         private delegate bool WNDENUMPROC(IntPtr hWnd, int lParam);
 61 
 62         [DllImport("User32.dll", EntryPoint = "SendMessage")]
 63         public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
 64 
 65 
 66         #region  獲取所有窗體句柄
 67 
 68         //Copyright © http://www.cnblogs.com/oraclejava/articles/1549025.html
 69 
 70         [DllImport("user32.dll")]
 71         private static extern bool EnumWindows(WNDENUMPROC lpEnumFunc, int lParam);
 72         [DllImport("user32.dll")]
 73         private static extern int GetWindowTextW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);
 74         [DllImport("user32.dll")]
 75         private static extern int GetClassNameW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);
 76         public struct WindowInfo
 77         {
 78             public IntPtr hWnd;
 79             public string szWindowName;
 80             public string szClassName;
 81 
 82             public override string ToString()
 83             {
 84                 return "0x" + hWnd.ToString("X8") + " '" + szWindowName + "' '" + szClassName + "'";
 85             }
 86         }
 87 
 88         public static List<WindowInfo> EnumWindows()
 89         {
 90             List<WindowInfo> wndList = new List<WindowInfo>();
 91 
 92             EnumWindows(delegate(IntPtr hWnd, int lParam)
 93             {
 94                 WindowInfo wnd = new WindowInfo();
 95                 StringBuilder sb = new StringBuilder(256);
 96                 wnd.hWnd = hWnd;
 97                 GetWindowTextW(hWnd, sb, sb.Capacity);
 98                 wnd.szWindowName = sb.ToString();
 99                 GetClassNameW(hWnd, sb, sb.Capacity);
100                 wnd.szClassName = sb.ToString();
101                 wndList.Add(wnd);
102                 return true;
103             }, 0);
104 
105             return wndList;
106         }
107 
108         #endregion
109 
110 
111         #region  操作系統 時間修改
112 
113         public static bool SetSystemTime(DateTime newDateTime)
114         {
115             SystemTime sysTime = new SystemTime();
116             sysTime.wYear = Convert.ToUInt16(newDateTime.Year);
117             sysTime.wMonth = Convert.ToUInt16(newDateTime.Month);
118             sysTime.wDay = Convert.ToUInt16(newDateTime.Day);
119             sysTime.wHour = Convert.ToUInt16(newDateTime.Hour);
120             sysTime.wMinute = Convert.ToUInt16(newDateTime.Minute);
121             sysTime.wSecond = Convert.ToUInt16(newDateTime.Second);
122             sysTime.wMiliseconds = (ushort)newDateTime.Millisecond;
123             return SystemDateTime.SetLocalTime(ref sysTime);
124         }
125 
126         private class SystemDateTime
127         {
128             [DllImport("Kernel32.dll")]
129             public static extern bool SetLocalTime(ref SystemTime sysTime);
130 
131             [DllImport("Kernel32.dll")]
132             public static extern void GetLocalTime(ref SystemTime sysTime);
133         }
134 
135         [StructLayout(LayoutKind.Sequential)]
136         private struct SystemTime
137         {
138             public ushort wYear;
139             public ushort wMonth;
140             public ushort wDayOfWeek;
141             public ushort wDay;
142             public ushort wHour;
143             public ushort wMinute;
144             public ushort wSecond;
145             public ushort wMiliseconds;
146         }
147 
148         #endregion
149 
150     }

 

項目編譯:

新建一個 WinForm 程式。

將上面的代碼 複製替換。

編譯之後,將 exe 創建一個 快捷方式,放到 “啟動” 菜單中,開機就啟動,讓exe在後臺運行即可。

 

操作爭議:

作者非常尊重 軟體著作權、版權 —— 無意傷害微軟利益。

用這種方式 延長試用,似乎有兩個爭議:修改系統時間、發送 WM_CLOSE 消息。

 

> 修改系統時間 是一種 普通操作,任何人都可以進行。【不具備爭議性】

> 發送 WM_CLOSE 消息,一個程式給另一個程式發送消息,改變另外的程式的行為【有點外掛的味道】。 —— 但仔細一想:電腦關機時,系統會給每一個程式 都發送 WM_CLOSE 消息。這樣一想,就突然不覺得侵權了。

 

 

尊重知識產權:

作者非常尊重 軟體著作權、版權 —— 如果本文的操作 損害了 微軟的利益,請及時聯繫作者,刪除、修改 此文。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Python 支持格式化字元串的輸出 。儘管這樣可能會用到非常複雜的表達式,但最基本的用法是將一個值插入到一個有字元串格式符 %s 的字元串中。上海python培訓-上海尚學堂編輯寫作。人工智慧時代,Python先行! Python vs. C: 格式化 字元串 在 Python 中,字元串格式化使 ...
  • 一 新建一個Java項目 二 新建一個Web項目 三 新建一個Maven項目 四 web.xml常見版本 五 pom.xml純凈版 ...
  • 數據類型 整數 浮點數 字元串 布爾值 空值 變數 常量 整數 浮點數 字元串 布爾值 空值 數據類型 Python可以處理任意大小的整數,也包括負整數。 在Python中,有兩種除法,一種是/:10 / 3,結果為3.33333333333333333,/除法計算結果是浮點數,即使兩個整數恰好整除 ...
  • 1:is 是判斷類型,用於檢查對象是否與給定類型相容,不成功則不會拋出異常,如果相容則返回true,如果不相容則返回false。在進行類型轉換之前用 在上面的例子中進行兩次相容性檢查,一在判斷時P_obj is System.String,另一次在轉換(string)P_obj時。用as只需要 一次 ...
  • 母版頁是一個擴展名為.master的ASP.NET文件,主要是為了應用程式創建統一的用戶功能界面和樣式。 ContentPlaceHolder控制項只能在母版頁中使用,在平常的web頁面使用,會發生解析器錯誤。 內容頁中可以有多個Content伺服器控制項,但內容頁里的Content控制項的Content ...
  • 一、課程介紹 本次分享課程屬於《C#高級編程實戰技能開發寶典課程系列》中的第五部分,阿笨後續會計劃將實際項目中的一些比較實用的關於C#高級編程的技巧分享出來給大家進行學習,不斷的收集、整理和完善此系列課程! 本次分享課程適合人群如下: 1、想學習Grid++Report報表工具在C/S項目中的實戰演 ...
  • 今天我們來探索一下Singleton設計模式的實現及應用場景。 Singleton模式屬於Creational Type(創建型)設計模式的一種。該模式一般用於確保在應用中僅創建一個某類的instance,在應用中的各個地方對該類的實例對象的引用均指向同一instacne。 Singleton模式的 ...
  • 20180522更新內容 本次更新增加了excel導入導出示例,QuerySuite組件實現導出導出,用最少代碼,做最多的事,代碼就是如此簡單。 計劃修改內容 1、人臉登錄功能需要重構,目前功能不完善。 2、QuerySuite類重構,同時支持mysql,oracle 3、增加視頻處理功能。 4、分 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...