转载:http://www.jb51.net/article/66235.htm
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#能够有所帮助。