VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > Objective-C编程 >
  • c#使用热键隐含窗口

制作者:剑锋冷月 单位:无忧统计网,www.51stat.net
  尝试便捷的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];
}
}
}
}http://www.cnblogs.com/tanghuawei/archive/2006/10/11/526387.html
 


相关教程