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

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#能够有所帮助。

(0)

相关推荐

  • C#一个简单的定时小程序实现代码

    之前一直觉得定时程序好神秘,后来,当我自己真正写了一个小的定时程序时,发现其实没有想象中的那么难.下面,我分享一下我自己的操作过程,希望能对大家有帮助. 1)在我们的项目中添加引用文件:TaskSchedulerEngine.dll(dll定义了一个ITask接口,定义了两个方法Initialize和HandleConditionsMetEvent): 2)创建一个定时触发的类:SyncTask.cs(类名自己随便定义),该类必须实现接口 ITask.具体代码如下: public class S

  • C#对称加密(AES加密)每次生成的结果都不同的实现思路和代码实例

    思路:使用随机向量,把随机向量放入密文中,每次解密时从密文中截取前16位,其实就是我们之前加密的随机向量. 代码: public static string Encrypt(string plainText, string AESKey) { RijndaelManaged rijndaelCipher = new RijndaelManaged(); byte[] inputByteArray = Encoding.UTF8.GetBytes(plainText);//得到需要加密的字节数组

  • C#实现开机自动启动设置代码分享

    /// <summary> /// 设置程序开机启动 /// 或取消开机启动 /// </summary> /// <param name="started">设置开机启动,或者取消开机启动</param> /// <param name="exeName">注册表中程序的名字</param> /// <param name="path">开机启动的程序路径<

  • C#对文件进行加密解密代码

    加密代码 using System; using System.IO; using System.Security.Cryptography; public class Example19_9 { public static void Main() { // Create a new file to work with FileStream fsOut = File.Create(@"c:\temp\encrypted.txt"); // Create a new crypto pro

  • C#判断某个软件是否已安装实现代码分享

    private void button1_Click(object sender, EventArgs e) { if (checkAdobeReader() == true) { MessageBox.Show("有安裝 Adobe Reader "); } else { MessageBox.Show("沒有安裝 Adobe Reader "); } } /// <summary> /// 確認是否有安裝 Adobe Reader /// </

  • C#代码性能测试类(简单实用)

    介绍: 可以很方便的在代码里循环执行 需要测试的函数  自动统计出执行时间,支持多线程. 使用方法: PerformanceTest p = new PerformanceTest(); p.SetCount(10);//循环次数(默认:1) p.SetIsMultithread(true);//是否启动多线程测试 (默认:false) p.Execute( i => { //需要测试的代码 Response.Write(i+"<br>"); System.Threa

  • C#实现关闭其他程序窗口或进程代码分享

    在进行winform开发过程中有时候会需要关闭其他程序或者关闭进程,以前写过一篇相关介绍的文章,今天有同事问起来,于是在次翻出来和大家分享一下. 下面介绍我所知的两种方法,应该对大家有帮助,如果有朋友知道其他的方法,谢谢共享一下. 方法1 ProcName 需要关闭的进程名称 private bool closeProc(string ProcName) { bool result = false; System.Collections.ArrayList procList = new Syst

  • C#实现的json序列化和反序列化代码实例

    using System; using System.Collections.Generic; using System.Web.Script.Serialization; using System.Configuration; using System.Runtime.Serialization.Json; using System.Runtime.Serialization; using System.IO; using System.Text; namespace WebApplicati

  • C#之IO读写文件方法封装代码

    具体不做详细介绍了,直接上代码 /// <summary> /// 功能:FileStream文件流读取文件 /// </summary> /// <param name="filePath">参数:文件路径</param> /// <returns>返回值:StreamReader对象</returns> public static StreamReader ReadFileByFs(string filePat

  • 10个C#程序员经常用到的实用代码片段

    1 读取操作系统和CLR的版本 OperatingSystem os = System.Environment.OSVersion; Console.WriteLine("Platform: {0}", os.Platform); Console.WriteLine("Service Pack: {0}", os.ServicePack); Console.WriteLine("Version: {0}", os.Version); Consol

  • C#生成Word文档代码示例

    public bool CreateWordFile(string _filename, "数据List或者你C#要写的数据") { #region 开始生成Word try { string strtitle = "任务导出"; object oEndOfDoc = "//endofdoc"; Object Nothing = System.Reflection.Missing.Value; Object filename = _filenam

  • C#获取网页源代码的方法

    本文实例讲述了C#获取网页源代码的方法.分享给大家供大家参考.具体如下: public string GetPageHTML(string url) { try { HttpWebRequest wr = WebRequest.Create(url) as HttpWebRequest; wr.Method = "get"; wr.Accept = "*/*"; wr.Headers.Add("Accept-Language: zh-cn");

随机推荐