您的位置:首页 > 编程语言 > C#

C#使用热键隐藏窗口

2014-01-15 14:29 337 查看


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

using System; 
using System.Text; 
using System.Collections; 
using System.Runtime.InteropServices; 

namespace WindowHider 
{ 
    /// <summary> 
    /// Object used to control a Windows Form. 
    /// </summary> 
    public class Window 
    { 
        /// <summary> 
        /// Win32 API Imports 
        /// </summary> 
        [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); 

        /// <summary> 
        /// Win32 API Constants for ShowWindowAsync() 
        /// </summary> 
        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; 

        /// <summary> 
        /// Private Fields 
        /// </summary> 
        private IntPtr m_hWnd; 
        private string m_Title; 
        private bool m_Visible = true; 
        private string m_Process; 
        private bool m_WasMax = false; 

        /// <summary> 
        /// Window Object's Public Properties 
        /// </summary> 
        public IntPtr hWnd 
        { 
            get{return m_hWnd;} 
        } 
        public string Title 
        { 
            get{return m_Title;} 
        } 
        public string Process 
        { 
            get{return m_Process;} 
        } 

        /// <summary> 
        /// Sets this Window Object's visibility 
        /// </summary> 
        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; 
                } 
            } 
        } 

        /// <summary> 
        /// Constructs a Window Object 
        /// </summary> 
        /// <param name="Title">Title Caption</param> 
        /// <param name="hWnd">Handle</param> 
        /// <param name="Process">Owning Process</param> 
        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; 
            } 
        } 

        /// <summary> 
        /// Sets focus to this Window Object 
        /// </summary> 
        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); 
            } 
        } 
    } 

    /// <summary> 
    /// Collection used to enumerate Window Objects 
    /// </summary> 
    public class Windows : IEnumerable, IEnumerator 
    { 
        /// <summary> 
        /// Win32 API Imports 
        /// </summary> 
        [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; 

        /// <summary> 
        /// Collection Constructor with additional options 
        /// </summary> 
        /// <param name="Invisible">Include invisible Windows</param> 
        /// <param name="Untitled">Include untitled Windows</param> 
        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); 
        } 
        /// <summary> 
        /// Collection Constructor 
        /// </summary> 
        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]; 
} 
} 
} 
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: