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>();
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;
}
public static void UnRegist (IntPtr hWnd, HotKeyCallBackHanlder callBack)
{
foreach (var var in keymap)
{
if (var .Value == callBack)
UnregisterHotKey(hWnd, var .Key);
}
}
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
}
}
运行结果如图: