热键设置:
[DllImport("user32.dll", SetLastError = true)]
public static extern bool RegisterHotKey(
IntPtr hWnd, //要定义热键的窗口的句柄
int id, //定义热键ID(不能与其它ID重复)
uint 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
}
使用系统的Settings
优势,可以免去每次都去写Xmldocment对象去读数据
我们在配置文件里面这样写:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type =" System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="ScreenCutter.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<userSettings>
<ScreenCutter.Properties.Settings>
<setting name="HotKey" serializeAs="String">
<value>A</value>
</setting>
<setting name="isCtrlHotKey" serializeAs="String">
<value>True</value>
</setting>
<setting name="isAltHotKey" serializeAs="String">
<value>True</value>
</setting>
<setting name="DefaultHotKey" serializeAs="String">
<value>A</value>
</setting>
</ScreenCutter.Properties.Settings>
</userSettings>
</configuration>
然后我们再程序里这样读写存取:
Settings.Default.HotKey = Keys.A;
Settings.Default.Save();
组合键:
uint ctrHotKey = (uint)KeyModifiers.Control;
if (Settings.Default.isAltHotKey)
{
ctrHotKey =(uint)(KeyModifiers.Alt | KeyModifiers.Control);
}
HotKey.RegisterHotKey(Handle, 100, ctrHotKey, Settings.Default.HotKey);//注意这里的100
来看看这里的逻辑:
当热键的消息来的时候,也就wndproc捕捉到const int WM_HOTKEY = 0x0312 消息的时候,
case WM_HOTKEY:
PostHotKey(Message m);
break;
在这个消息处理中,判断是不是本窗口的事件
private void ProcessHotkey(Message m) //按下设定的键时调用该函数
{
IntPtr id = m.WParam; //IntPtr用于表示指针或句柄的平台特定类型
string sid = id.ToString();
switch (sid)
{
case "100":
CutScreen();
break;
default:
break;
}
}