在C#中使用热键隐含窗口.net -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【www.unjs.com - 电脑资料】

    我们曾经想过能够在我们的计算机上将窗口隐蔽起来,不想被从身边走过的老板看见,

在C#中使用热键隐含窗口.net

。尝试便捷的Windows隐藏并定义热键来控制它们。下面我们将演示如何通过热键,我们将会用到DllImports of Win32 API、CallBacks/Delegates,定制事件与事件的句柄。 using Syste

   

   

    我们曾经想过能够在我们的计算机上将窗口隐蔽起来,不想被从身边走过的老板看见。尝试便捷的Windows隐藏并定义热键来控制它们。下面我们将演示如何通过热键,我们将会用到DllImports of Win32 API、CallBacks/Delegates,定制事件与事件的句柄。

    using System;

    using System.Text;

    using System.Collections;

    using System.Runtime.InteropServices;

    namespace WindowHider

    {

    ///

    /// Object used to control a Windows Form.

    ///

    public class Window

    {

    ///

    /// Win32 API Imports

    ///

    [DllImport("user32.dll")] private static extern

    bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);

    [DllImport("user32.dll")] private static extern

    bool SetForegroundWindow(IntPtr hWnd);

    [DllImport("user32.dll")] private static extern

    bool IsIconic(IntPtr hWnd);

    [DllImport("user32.dll")] private static extern

    bool IsZoomed(IntPtr hWnd);

    [DllImport("user32.dll")] private static extern

    IntPtr GetForegroundWindow();

    [DllImport("user32.dll")] private static extern

    IntPtr GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);

    [DllImport("user32.dll")] private static extern

    IntPtr AttachThreadInput(IntPtr idAttach, IntPtr idAttachTo, int fAttach);

    ///

    /// Win32 API Constants for ShowWindowAsync()

    ///

    private const int SW_HIDE = 0;

    private const int SW_SHOWNORMAL = 1;

    private const int SW_SHOWMINIMIZED = 2;

    private const int SW_SHOWMAXIMIZED = 3;

    private const int SW_SHOWNOACTIVATE = 4;

    private const int SW_RESTORE = 9;

    private const int SW_SHOWDEFAULT = 10;

    ///

    /// Private Fields

    ///

    private IntPtr m_hWnd;

    private string m_Title;

    private bool m_Visible = true;

    private string m_Process;

    private bool m_WasMax = false;

    ///

    /// Window Object's Public Properties

    ///

    public IntPtr hWnd

    {

    get{return m_hWnd;}

    }

    public string Title

    {

    get{return m_Title;}

    }

    public string Process

    {

    get{return m_Process;}

    }

    ///

    /// Sets this Window Object's visibility

    ///

    public bool Visible

    {

    get{return m_Visible;}

    set

    {

    //show the window

    if(value == true)

    {

    if(m_WasMax)

    {

    if(ShowWindowAsync(m_hWnd,SW_SHOWMAXIMIZED))

    m_Visible = true;

    }

    else

    {

    if(ShowWindowAsync(m_hWnd,SW_SHOWNORMAL))

    m_Visible = true;

    }

    }

    //hide the window

    if(value == false)

    {

    m_WasMax = IsZoomed(m_hWnd);

    if(ShowWindowAsync(m_hWnd,SW_HIDE))

    m_Visible = false;

    }

    }

    }

    ///

    /// Constructs a Window Object

    ///

    /// Title Caption

    /// Handle

    /// Owning Process

    public Window(string Title, IntPtr hWnd, string Process)

    {

    m_Title = Title;

    m_hWnd = hWnd;

    m_Process = Process;

    }

    //Override ToString()

    public override string ToString()

    {

    //return the title if it has one, if not return the process name

    if (m_Title.Length > 0)

    {

    return m_Title;

    }

    else

    {

    return m_Process;

    }

    }

    ///

    /// Sets focus to this Window Object

    ///

    public void Activate()

    {

    if(m_hWnd == GetForegroundWindow())

    return;

    IntPtr ThreadID1 = GetWindowThreadProcessId(GetForegroundWindow(),

    IntPtr.Zero);

    IntPtr ThreadID2 = GetWindowThreadProcessId(m_hWnd,IntPtr.Zero);

    if (ThreadID1 != ThreadID2)

    {

    AttachThreadInput(ThreadID1,ThreadID2,1);

    SetForegroundWindow(m_hWnd);

    AttachThreadInput(ThreadID1,ThreadID2,0);

    }

    else

    {

    SetForegroundWindow(m_hWnd);

    }

    if (IsIconic(m_hWnd))

    {

    ShowWindowAsync(m_hWnd,SW_RESTORE);

    }

    else

    {

    ShowWindowAsync(m_hWnd,SW_SHOWNORMAL);

    }

    }

    }

    ///

    /// Collection used to enumerate Window Objects

    ///

    public class Windows : IEnumerable, IEnumerator

    {

    ///

    /// Win32 API Imports

    ///

    [DllImport("user32.dll")] private static extern

    int GetWindowText(int hWnd, StringBuilder title, int size);

    [DllImport("user32.dll")] private static extern

    int GetWindowModuleFileName(int hWnd, StringBuilder title, int size);

    [DllImport("user32.dll")] private static extern

    int EnumWindows(EnumWindowsProc ewp, int lParam);

    [DllImport("user32.dll")] private static extern

    bool IsWindowVisible(int hWnd);

    //delegate used for EnumWindows() callback function

    public delegate bool EnumWindowsProc(int hWnd, int lParam);

    private int m_Position = -1; // holds current index of wndArray,

    // necessary for IEnumerable

    ArrayList wndArray = new ArrayList(); //array of windows

    //Object's private fields

    private bool m_invisible = false;

    private bool m_notitle = false;

    ///

    /// Collection Constructor with additional options

    ///

    /// Include invisible Windows

    /// Include untitled Windows

    public Windows(bool Invisible, bool Untitled)

    {

    m_invisible = Invisible;

    m_notitle = Untitled;

    //Declare a callback delegate for EnumWindows() API call

    EnumWindowsProc ewp = new EnumWindowsProc(EvalWindow);

    //Enumerate all Windows

    EnumWindows(ewp, 0);

    }

    ///

    /// Collection Constructor

    ///

    public Windows()

    {

    //Declare a callback delegate for EnumWindows() API call

    EnumWindowsProc ewp = new EnumWindowsProc(EvalWindow);

    //Enumerate all Windows

    EnumWindows(ewp, 0);

    }

    //EnumWindows CALLBACK function

    private bool EvalWindow(int hWnd, int lParam)

    {

    if (m_invisible == false && !IsWindowVisible(hWnd))

    return(true);

    StringBuilder title = new StringBuilder(256);

    StringBuilder module = new StringBuilder(256);

    GetWindowModuleFileName(hWnd, module, 256);

    GetWindowText(hWnd, title, 256);

    if (m_notitle == false && title.Length == 0)

    return(true);

    wndArray.Add(new Window(title.ToString(), (IntPtr)hWnd,

    module.ToString()));

    return(true);

    }

    //implement IEnumerable

    public IEnumerator GetEnumerator()

    {

    return (IEnumerator)this;

    }

    //implement IEnumerator

    public bool MoveNext()

    {

    m_Position++;

    if (m_Position < wndArray.Count)

    {

    return true;

    }

    else

    {

    return false;

    }

    }

    public void Reset()

    {

    m_Position = -1;

    }

    public object Current

    {

    get

    {

    return wndArray[m_Position];

    }

    }

    }

    }

    原文转自:http://www.ltesting.net

最新文章