刚好碰到一个朋友要求,要隐藏窗体界面,网上下载了几个,都不太合意,很多都被杀毒软件认为是有害软件,没办法,只能自已写个隐藏窗体界面的小工具。
.NET 2.0, C#
/***************************************************
* 开发者:0x001 *
* 开发时间:2012-05-17 *
* 功能:List 获取所有显示的窗口列表名称 *
* Keyword 是要隐藏的窗口名称包含的关键字 *
* Start时正式关闭,Stop时关闭按钮将隐藏程序 *
* 本程序隐藏时 Ctrl+Alt+9 激活主界面 *
* Start之后生隔5秒扫描一次窗口,继续隐藏 *
**************************************************/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Threading;
namespace SovHid
{
public partial class Form1 : Form
{
#region Windows API
[DllImport("user32.dll", EntryPoint = "FindWindowEx", SetLastError = true)]
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("coredll.dll", EntryPoint = "FindWindow")]
private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll", EntryPoint = "ShowWindow", SetLastError = true)]
static extern bool ShowWindow(IntPtr hWnd, uint nCmdShow);
[DllImport("user32.dll")]
public static extern int EnumWindows(EnumWindowsProc ewp, int lParam);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowText(IntPtr hWnd, out STRINGBUFFER text, int nMaxCount);
[DllImport("user32.dll")]
public static extern bool IsWindowVisible(IntPtr hWnd);
[DllImport("user32.dll")]
public static extern IntPtr GetWindowThreadProcessId(IntPtr hwnd, ref int lpdwProcessId);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct STRINGBUFFER
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)]
public string szText;
}
#endregion
#region 系统热键
[DllImport("user32")]
public static extern bool RegisterHotKey(IntPtr hWnd, int id, KeyModifiers control, Keys vk);
//注册热键的api
[DllImport("user32")]
public static extern bool UnregisterHotKey(IntPtr hWnd, int id);
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case 0x0312: //这个是window消息定义的 注册的热键消息
if (m.WParam.ToString().Equals("888")) //如果是我们注册的那个热键
{
this.ShowInTaskbar = true;
this.Show();
this.Focus();
}
break;
}
base.WndProc(ref m);
}
public enum KeyModifiers
{
None = 0,
Alt = 1,
Ctrl = 2,
Shift = 4,
WindowsKey = 8
}
#endregion
private string Gname = string.Empty;
private bool isRunning = false;
public delegate bool EnumWindowsProc(IntPtr p_Handle, int p_Param);
public delegate void MainFromSetRtbHandler(string str, bool isAdd);
#region 窗体事件
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
MessageWindwos(false);
this.TopMost = true; //窗体总在最前
this.StartPosition = FormStartPosition.CenterScreen; //设置窗体的位置
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
//注消热键(句柄,热键ID)
UnregisterHotKey(this.Handle, 888);
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (isRunning)
{
HideMyFrom();
e.Cancel = true;
}
}
#endregion
#region Change RichTextBox
/// <summary>
/// RichTextBox添加
/// </summary>
private void SetRtbMessage(string str, bool isAdd)
{
if (rtb_List.InvokeRequired)
{
MainFromSetRtbHandler CallBack = new MainFromSetRtbHandler(SetRtbMessage);
this.Invoke(CallBack, new object[] { str, isAdd });
}
else
{
if (isAdd)
{
rtb_List.Text += str + "\r\n";
}
else
{
rtb_List.Text = str;
}
}
}
public void MessageWindwos(bool isHidden)
{
EnumWindowsProc _EunmWindows = null;
if (!isHidden)
{
_EunmWindows = new EnumWindowsProc(NetEnumWindows);
}
else
{
_EunmWindows = new EnumWindowsProc(NetEnumWindowsHidden);
}
EnumWindows(_EunmWindows, 0);
}
#endregion
/// <summary>
/// 隐藏WinFrom窗体界面
/// </summary>
private void HideMyFrom()
{
this.Hide();
this.ShowInTaskbar = false;
//注册热键(窗体句柄,热键ID,辅助键,实键)
RegisterHotKey(this.Handle, 888, KeyModifiers.Ctrl | KeyModifiers.Alt, Keys.D9);
}
/// <summary>
/// 读取不隐藏
/// </summary>
private bool NetEnumWindows(IntPtr p_Handle, int p_Param)
{
if (!IsWindowVisible(p_Handle)) return true;
STRINGBUFFER _TitleString = new STRINGBUFFER();
GetWindowText(p_Handle, out _TitleString, 256);
if (_TitleString.szText != "")
{
SetRtbMessage(_TitleString.szText, true);
}
return true;
}
/// <summary>
/// 隐藏事件
/// </summary>
private bool NetEnumWindowsHidden(IntPtr p_Handle, int p_Param)
{
STRINGBUFFER _TitleString = new STRINGBUFFER();
GetWindowText(p_Handle, out _TitleString, 256);
if (_TitleString.szText != "")
{
if (!IsWindowVisible(p_Handle) && !isRunning)
{
if (_TitleString.szText.IndexOf(Gname) > -1)
{
ShowWindow(p_Handle, 1);
}
}
else
{
if (_TitleString.szText.IndexOf(Gname) > -1)
{
ShowWindow(p_Handle, 0);
}
}
}
return true;
}
/// <summary>
/// 线程-处理事件
/// </summary>
private void ThreadHandler()
{
while (isRunning)
{
MessageWindwos(true);
System.Threading.Thread.Sleep(5000);
}
}
/// <summary>
/// 按钮事件-开始或结束
/// </summary>
private void btn_Start_Click(object sender, EventArgs e)
{
if (!isRunning)
{
Gname = txt_Keyword.Text.Trim();
if (string.IsNullOrEmpty(Gname))
{
MessageBox.Show("Please enter a Keyword!");
txt_Keyword.Focus();
return;
}
isRunning = true;
txt_Keyword.Enabled = false;
btn_Start.Text = "Stop";
Thread th = new Thread(new ThreadStart(ThreadHandler));
th.IsBackground = true;
th.Start();
}
else
{
isRunning = false;
txt_Keyword.Enabled = true;
btn_Start.Text = "Start";
MessageWindwos(true);
SetRtbMessage("", false);
MessageWindwos(false);
}
}
/// <summary>
/// 按钮事件-窗体列表
/// </summary>
private void btn_List_Click(object sender, EventArgs e)
{
SetRtbMessage("", false);
MessageWindwos(false);
}
}
}