中山网站方案,wordpress自动插件下载,网站建设明细报价,中山网上办事大厅群里有个同学问了问题 如何隐藏运行 winform 程序#xff1f;#xff0c;提起了我的兴趣#xff0c;玩玩呗#xff1f;那就玩玩吧#xff01;第一版 将一个 winform 程序隐藏执行#xff0c;隐藏执行的方式有很多种#xff0c;第一个 demo 就用最简单的方式#xff0c;… 群里有个同学问了问题 如何隐藏运行 winform 程序提起了我的兴趣玩玩呗那就玩玩吧第一版 将一个 winform 程序隐藏执行隐藏执行的方式有很多种第一个 demo 就用最简单的方式实现隐藏执行。demo 执行时不会显示任何窗体但是过10秒会弹出对话框证明程序在运行。按照常规思路在窗体初始化完成之后调整窗体参数。public partial class Form1 : Form
{public Form1(){InitializeComponent();//不要显示在任务栏this.ShowInTaskbar false;//隐藏窗体this.Visible false;//窗体宽度调整为0this.Width 0;//窗体高度调整为0this.Height 0;//窗体最左边设置成-10000保证在屏幕外边this.Left -10000;//窗体最顶部设置成-10000保证在屏幕外边this.Top -10000;}
}
在 Form1_Load 方法里新启动一个线程弹出对话框试试。private void Form1_Load(object sender, EventArgs e)
{new Thread(new ThreadStart(() {Thread.Sleep(10 * 1000);MessageBox.Show(我在后台执行哟...);})).Start();
}
运行起来发现还是有显示而且左边和顶边的位置没有设置成功。如图还有一个 opacity窗体透明度的属性设置成0。如下this.Opacity 0;
现在就好了看不见窗体达到了隐藏的目的简单粗暴但是还凑合实用。不足之处窗体虽然是隐藏了但只是调整了透明度心里有点不爽明明它是存在的肉眼看不见而已。第二版 经过第一个 demo我们简单的实现了一个隐藏运行的应用程序那么还有什么方式能隐藏执行呢细心的同学发现这里在 Program.cs 文件 Main 方法中运行了一个 new Form1()那么有什么办法能不执行这一句应用程序还能运行呢我们把这一句注释掉看到 Application 类提供了一个 Run 方法不带任何参数。我们试着删掉没用的 Form1 这个窗体把代码改成下面这样执行一下试试。Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new Form1());
Application.Run();
prefect程序照常可以运行任务管理器中可以看到 HiddenApp2.exe 这个进程也不用费心隐藏窗体何乐不为PS: 某些想法不良的同学可能想到了隐藏起来干点坏事记住法网恢恢、疏而不漏再来改造一下让他实现上面的功能10秒后弹出一个对话框证明程序确实在运行。Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new Form1());
new Thread(new ThreadStart(()
{Thread.Sleep(10 * 1000);MessageBox.Show(我在后台执行哟...);
})).Start();
Application.Run();
代码很简单就是启动一个线程延迟10秒后弹窗有的同学可能要问了为啥 new Thread 不放在 Application.Run() 方法之后因为 Application.Run() 会使应用程序主进程阻塞执行所以后面的代码不会执行。扩展 这一节里我们使用第二步里使用的方法来干一点坏事PS我喜欢做一个 剪切板尾巴 。最终效果他会在你复制的文本后面缀上设置好的文字然后放进剪切板。迅雷的监视剪切板就是监视了剪切板中是否有 Html 格式的文本从中间解析 URL实现下载。winform 使用 Clipboard 这个密封类实现剪切板的一些基本用法来看下定义namespace System.Windows.Forms
{public sealed class Clipboard{public static void Clear();public static bool ContainsAudio();public static bool ContainsData(string format);public static bool ContainsFileDropList();public static bool ContainsImage();public static bool ContainsText(TextDataFormat format);public static bool ContainsText();public static Stream GetAudioStream();public static object GetData(string format);public static IDataObject GetDataObject();public static StringCollection GetFileDropList();public static Image GetImage();public static string GetText();public static string GetText(TextDataFormat format);public static void SetAudio(Stream audioStream);public static void SetAudio(byte[] audioBytes);public static void SetData(string format, object data);public static void SetDataObject(object data);public static void SetDataObject(object data, bool copy, int retryTimes, int retryDelay);public static void SetDataObject(object data, bool copy);public static void SetFileDropList(StringCollection filePaths);public static void SetImage(Image image);public static void SetText(string text);public static void SetText(string text, TextDataFormat format);}
}这一节主要是使用 public static string GetText(); 这个方法来盗取用户剪切的内容并在其后边追加一个尾巴来恶搞一下。原理使用后台线程定时的把剪切板内容复制下来然后追加一些文字再写回剪切板。废话不多说直接上核心代码var text Clipboard.GetText();
//不要问我为啥不用 String.IsNullOrEmpty()因为我用的 .Net Framework 3.5
if (text ! null text.Length 0)
{if (!text.EndsWith(TAIL)){Clipboard.SetText(text TAIL);Debug.WriteLine($[{DateTime.Now.ToString(yyyy-MM-dd HH:mm:ss)}] successful catch text【{text}】changed to【{Clipboard.GetText()}】);}
}
代码很短但是很恶搞。有趣的问题看下面的代码private static void MemoryBomb()
{Clipboard.SetDataObject(new MemoryStream(new byte[1024000000 * 2L]));var data Clipboard.GetDataObject()?.GetData(typeof(MemoryStream));var thread new Thread(new ThreadStart(() {Thread.Sleep(3000);//1data null;GC.Collect();Clipboard.SetDataObject(new MemoryStream(new byte[0]));data Clipboard.GetDataObject()?.GetData(typeof(MemoryStream));//2data null;GC.Collect();}));thread.SetApartmentState(ApartmentState.STA);thread.Start();
}
看到剪切板 Clipboard.SetDataObject 方法可以接受一个 object 参数我好奇的弄了一个很大的 byte[] 放了进去结果发现在 GetData() 方法调用后内存剧增完全算得上内存炸弹大小是2倍的 byte[] 大小字节我又重启一个线程来再次调用 SetDataObject() 方法设置剪切板内容发现内存不会释放。加了第一个 GC.Collect(); 之后内存会降一半我猜想 data 变量被释放但是剪切板内容没释放2倍大小的字节应该是 data 变量占用 2G剪切板占用 2G。如图刚启动GC.Collect();紧接着执行完毕这段代码之后data null;
GC.Collect();
Clipboard.SetDataObject(new MemoryStream(new byte[0]));
data Clipboard.GetDataObject()?.GetData(typeof(MemoryStream));
有趣的是占用的2G内存不会释放。为什么上面的 GetData 会使内存剧增而这一句不会使内存变小呢如图2G紧接着执行第二个 GC.Collect(); 执行之后内存会被回收但是还是比最初的大了一些没有完全释放。如图奇思妙想可以用 Clipboard 申请一些内存然后在内存中执行一些代码会不会对系统造成威胁有能力的大牛可以尝试一下。完整代码using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading;
using System.Windows.Forms;namespace HiddenApp3
{static class Program{/// summary/// 应用程序的主入口点。/// /summary[STAThread]static void Main(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);//MemoryBomb();RunClipboardTail();Application.Run();}private static void MemoryBomb(){Clipboard.SetDataObject(new MemoryStream(new byte[1024000000 * 2L]));var data Clipboard.GetDataObject()?.GetData(typeof(MemoryStream));var thread new Thread(new ThreadStart(() {Thread.Sleep(3000);//1data null;GC.Collect();Clipboard.SetDataObject(new MemoryStream(new byte[1]));data Clipboard.GetDataObject()?.GetData(typeof(MemoryStream));//2data null;GC.Collect();}));thread.SetApartmentState(ApartmentState.STA);thread.Start();}private const string TAIL 你需要关注《开发者精选资讯》公众号;private static void RunClipboardTail(){var thread new Thread(new ThreadStart(() {while (true){try{var text Clipboard.GetText();if (text ! null text.Length 0){if (!text.EndsWith(TAIL)){Clipboard.SetText(text TAIL);Debug.WriteLine($[{DateTime.Now.ToString(yyyy-MM-dd HH:mm:ss)}] successful catch text【{text}】changed to【{Clipboard.GetText()}】);}}}catch { }Thread.Sleep(10000);}})){IsBackground true};thread.SetApartmentState(ApartmentState.STA);thread.Start();}}
}
githubhttps://github.com/mrhuo/HiddenAppDemo推荐阅读 基于GitBook框架搭建技术文档平台百度最牛x的5个开源项目第一个全票通过进入Apache孵化器开发者精选资讯 每日为您推荐开发精选资讯长按二维码关注 「开发者精选资讯」 公众号好文章我在看 ❤️