首页 > 编程 > C# > 正文

C#实现老板键功能的代码

2020-01-24 01:50:40
字体:
来源:转载
供稿:网友

C#设置热键隐藏指定窗口的代码

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];}}}}

再给大家分享一个其他网友的方法,也非常不错,详情请看注释。

using System;using System.Collections.Generic;using System.Runtime.InteropServices;using System.Windows.Forms;namespace drmaple{  class HotKey  {    //如果函数执行成功,返回值不为0。    //如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。    [DllImport("user32.dll", SetLastError = true)]    public static extern bool RegisterHotKey(            IntPtr hWnd,        //要定义热键的窗口的句柄      int id,           //定义热键ID(不能与其它ID重复)      KeyModifiers fsModifiers,  //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效      Keys vk           //定义热键的内容      );    [DllImport("user32.dll", SetLastError = true)]    public static extern bool UnregisterHotKey(      IntPtr hWnd,        //要取消热键的窗口的句柄      int id           //要取消热键的ID      );    //定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值)    [Flags()]    public enum KeyModifiers    {      None = 0,      Alt = 1,      Ctrl = 2,      Shift = 4,      WindowsKey = 8    }  }}//简单说明一下://“public static extern bool RegisterHotKey()”这个函数用于注册热键。由于这个函数需要引用user32.dll动态链接库后才能使用,并且//user32.dll是非托管代码,不能用命名空间的方式直接引用,所以需要用“DllImport”进行引入后才能使用。于是在函数前面需要加上//“[DllImport("user32.dll", SetLastError = true)]”这行语句。//“public static extern bool UnregisterHotKey()”这个函数用于注销热键,同理也需要用DllImport引用user32.dll后才能使用。//“public enum KeyModifiers{}”定义了一组枚举,将辅助键的数字代码直接表示为文字,以方便使用。这样在调用时我们不必记住每一个辅//助键的代码而只需直接选择其名称即可。//(2)以窗体FormA为例,介绍HotKey类的使用//在FormA的Activate事件中注册热键,本例中注册Shift+S,Ctrl+Z,Alt+D这三个热键。这里的Id号可任意设置,但要保证不被重复。private void Form_Activated(object sender, EventArgs e){  //注册热键Shift+S,Id号为100。HotKey.KeyModifiers.Shift也可以直接使用数字4来表示。  HotKey.RegisterHotKey(Handle, 100, HotKey.KeyModifiers.Shift, Keys.S);   //注册热键Ctrl+B,Id号为101。HotKey.KeyModifiers.Ctrl也可以直接使用数字2来表示。  HotKey.RegisterHotKey(Handle, 101, HotKey.KeyModifiers.Ctrl, Keys.B);  //注册热键Alt+D,Id号为102。HotKey.KeyModifiers.Alt也可以直接使用数字1来表示。  HotKey.RegisterHotKey(Handle, 102, HotKey.KeyModifiers.Alt, Keys.D);}//在FormA的Leave事件中注销热键。private void FrmSale_Leave(object sender, EventArgs e){  //注销Id号为100的热键设定  HotKey.UnregisterHotKey(Handle, 100);  //注销Id号为101的热键设定  HotKey.UnregisterHotKey(Handle, 101);  //注销Id号为102的热键设定  HotKey.UnregisterHotKey(Handle, 102);}重载FromA中的WndProc函数/// /// 监视Windows消息/// 重载WndProc方法,用于实现热键响应/// /// protected override void WndProc(ref Message m){  const int WM_HOTKEY = 0x0312;  //按快捷键   switch (m.Msg)  {    case WM_HOTKEY:      switch (m.WParam.ToInt32())      {        case 100:  //按下的是Shift+S          //此处填写快捷键响应代码           break;        case 101:  //按下的是Ctrl+B          //此处填写快捷键响应代码          break;        case 102:  //按下的是Alt+D          //此处填写快捷键响应代码          break;      }    break;  }  base.WndProc(ref m);}

以上所述就是本文的全部内容了,希望对大家学习C#能够有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表