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

posted @ 2018-06-05 08:46  #C和C#  阅读(458)  评论(0编辑  收藏  举报