using
System;
using
System.Collections.Generic;
using
System.Runtime.InteropServices;
using
System.Windows.Forms;
namespace
screenT
{
public
partial
class
ScreenForm : Form
{
public
ScreenForm()
{
InitializeComponent();
}
private
void
ScreenCapture()
{
DLL.PrScrn();
}
protected
override
void
WndProc(
ref
Message m)
{
base
.WndProc(
ref
m);
Hotkey.ProcessHotKey(m);
}
private
void
button1_Click(
object
sender, EventArgs e)
{
DLL.PrScrn();
}
private
void
Form1_Load(
object
sender, EventArgs e)
{
try
{
Hotkey.Regist(Handle, HotkeyModifiers.MOD_ALT, Keys.F1, ScreenCapture);
}
catch
(Exception te)
{
MessageBox.Show(
"Alt + A 热键被占用"
);
}
}
private
void
Form1_FormClosed(
object
sender, FormClosedEventArgs e)
{
Hotkey.UnRegist(Handle, ScreenCapture);
}
}
public
class
DLL
{
[DllImport(
"PrScrn.dll"
, EntryPoint =
"PrScrn"
)]
public
static
extern
int
PrScrn();
}
public
static
class
Hotkey
{
#region 系统api
[DllImport(
"user32.dll"
)]
[
return
: MarshalAs(UnmanagedType.Bool)]
private
static
extern
bool
RegisterHotKey(IntPtr hWnd,
int
id, HotkeyModifiers fsModifiers, Keys vk);
[DllImport(
"user32.dll"
)]
private
static
extern
bool
UnregisterHotKey(IntPtr hWnd,
int
id);
#endregion
public
delegate
void
HotKeyCallBackHanlder();
private
const
int
WM_HOTKEY = 0x312;
private
static
int
keyid = 10;
private
static
readonly
Dictionary<
int
, HotKeyCallBackHanlder> keymap =
new
Dictionary<
int
, HotKeyCallBackHanlder>();
/// <summary>
/// 注册快捷键
/// </summary>
/// <param name="hWnd">持有快捷键窗口的句柄</param>
/// <param name="fsModifiers">组合键</param>
/// <param name="vk">快捷键的虚拟键码</param>
/// <param name="callBack">回调函数</param>
public
static
void
Regist(IntPtr hWnd, HotkeyModifiers fsModifiers, Keys vk, HotKeyCallBackHanlder callBack)
{
int
id = keyid++;
if
(!RegisterHotKey(hWnd, id, fsModifiers, vk))
throw
new
Exception(
"regist hotkey fail."
);
keymap[id] = callBack;
}
/// <summary>
/// 注销快捷键
/// </summary>
/// <param name="hWnd">持有快捷键窗口的句柄</param>
/// <param name="callBack">回调函数</param>
public
static
void
UnRegist(IntPtr hWnd, HotKeyCallBackHanlder callBack)
{
foreach
(
var
var
in
keymap)
{
if
(
var
.Value == callBack)
UnregisterHotKey(hWnd,
var
.Key);
}
}
/// <summary>
/// 快捷键消息处理
/// </summary>
public
static
void
ProcessHotKey(Message m)
{
if
(m.Msg == WM_HOTKEY)
{
int
id = m.WParam.ToInt32();
HotKeyCallBackHanlder callback;
if
(keymap.TryGetValue(id,
out
callback))
{
callback();
}
}
}
}
public
enum
HotkeyModifiers
{
MOD_ALT = 0x1,
MOD_CONTROL = 0x2,
MOD_SHIFT = 0x4,
MOD_WIN = 0x8
}
}
暂时没有评论,来抢沙发吧~