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


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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    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];
    }
    }
    }
    }

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    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#能够有所帮助。

  • 相关阅读:
    解码.NET 2.0配置之谜(二)
    .NET (C#) Internals: Delegates (1)
    .NET (C#) Internals: Delegates (2)
    Windows Vista Beta 2 尝鲜
    assembly 需要 unload 和 update 的时候怎么办?测试工程
    让 NDoc 1.3 支持.NET 2.0 程序集,泛型输出和 Visual studio 2005 解决方案导入
    号召,有兴趣做博客园自己的网络游戏的请举手..
    将执行文件转化为bat批处理文件的工具(批处理文件方式提供)
    ISAPI Filter实现的防盗链程序终于完工
    1分钟破解3dState '学习版'得一些版权信息。
  • 原文地址:https://www.cnblogs.com/cnote/p/9137914.html
Copyright © 2020-2023  润新知