RaUI/Source/MyDb/SysFuns/WinHotReg.cs
鑫Intel 5d65c76f05 ### 2021-12-14更新
------
#### MyDbV4    V3.0.2112.1401
- *.[修复]修复MSSQL的ExecuteNonQuery函数可能因为报错导致软件崩溃的BUG。
2021-12-14 09:37:57 +08:00

349 lines
10 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
namespace SysFuns
{
/// <summary>
/// 功能键
/// </summary>
[Flags()]
public enum KeyModifiers
{
/// <summary>
/// 无
/// </summary>
None = 0,
/// <summary>
/// Alt键
/// </summary>
Alt = 1,
/// <summary>
/// Ctrl键
/// </summary>
Ctrl = 2,
/// <summary>
/// Alt+Ctrl键
/// </summary>
AltAndCtrl = 3,
/// <summary>
/// Shift键
/// </summary>
Shift = 4,
/// <summary>
/// Shift+Alt键
/// </summary>
AltAndShift = 5,
/// <summary>
/// Shift+Ctrl键
/// </summary>
CtrlAndShift = 6,
/// <summary>
/// Alt+Shift+Ctrl键
/// </summary>
AltAndCtrlAndShift = 7,
/// <summary>
/// Win键
/// </summary>
WindowsKey = 8
}
/// <summary>
/// 热键类
/// </summary>
public class WinHotReg : System.Windows.Forms.IMessageFilter
{
//如果函数执行成功返回值不为0。
//如果函数执行失败返回值为0。要得到扩展错误信息调用GetLastError。
[DllImport("user32.dll", SetLastError = true)]
private static extern bool RegisterHotKey(
IntPtr hWnd, //要定义热键的窗口的句柄
int id, //定义热键ID不能与其它ID重复
KeyModifiers fsModifiers, //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效
Keys vk //定义热键的内容
);
[DllImport("user32.dll", SetLastError = true)]
private static extern bool UnregisterHotKey(
IntPtr hWnd, //要取消热键的窗口的句柄
int id //要取消热键的ID
);
readonly IntPtr handle;
/// <summary>
/// 热键类
/// </summary>
/// <param name="_handle"></param>
public WinHotReg(IntPtr _handle)
{
handle = _handle;
System.Windows.Forms.Application.AddMessageFilter(this);
}
/// <summary>
/// 热键注销
/// </summary>
~WinHotReg()
{
UnHotKey();
System.Windows.Forms.Application.RemoveMessageFilter(this);
}
/// <summary>
/// 热键是否有效
/// </summary>
public bool Enabled { get; set; } = true;
/// <summary>
/// 释放热键
/// </summary>
public void Free()
{
UnHotKey();
System.Windows.Forms.Application.RemoveMessageFilter(this);
}
readonly List<HotKeyType> list_hotkey = new List<HotKeyType>();
/// <summary>
/// 获取热键Tag
/// </summary>
/// <param name="HotId"></param>
/// <returns></returns>
public string GetTag(int HotId)
{
var index = list_hotkey.FindIndex(a => a.id == HotId);
return index >= 0 ? list_hotkey[index].Tag : "";
}
/// <summary>
/// 获取热键id
/// </summary>
/// <param name="Tag"></param>
/// <returns></returns>
public int GetHotId(string Tag)
{
var index= list_hotkey.FindIndex(a => a.Tag == Tag);
return index >= 0 ? list_hotkey[index].id : -1;
}
/// <summary>
/// 获取热键id
/// </summary>
/// <param name="fsModifiers"></param>
/// <param name="vk"></param>
/// <returns></returns>
public int GetHotId(KeyModifiers fsModifiers, Keys vk)
{
var index = list_hotkey.FindIndex(a => a.fsModifiers == fsModifiers && a.vk == vk);
return index >= 0 ? list_hotkey[index].id : -1;
}
/// <summary>
/// 判断热键id是否存在
/// </summary>
/// <param name="hotId"></param>
/// <returns></returns>
public bool IsExist(int hotId)
{
var index = list_hotkey.FindIndex(a => a.id == hotId);
return index >= 0;
}
/// <summary>
/// 判断热键Tag是否存在
/// </summary>
/// <param name="Tag"></param>
/// <returns></returns>
public bool IsExist(string Tag)
{
var index = list_hotkey.FindIndex(a => a.Tag == Tag);
return index >= 0;
}
/// <summary>
/// 判断热键是否存在
/// </summary>
/// <param name="fsModifiers"></param>
/// <param name="vk"></param>
/// <returns></returns>
public bool IsExist(KeyModifiers fsModifiers, Keys vk)
{
var index = list_hotkey.FindIndex(a => a.fsModifiers == fsModifiers && a.vk==vk);
return index >= 0;
}
/// <summary>
/// 注册热键
/// </summary>
/// <param name="id"></param>
/// <param name="fsModifiers"></param>
/// <param name="vk"></param>
/// <returns></returns>
public bool RegHotKey(int id, KeyModifiers fsModifiers, Keys vk)
{
bool result = RegisterHotKey(handle, id, fsModifiers, vk);
if (result)
{
list_hotkey.Add(new HotKeyType(id, fsModifiers, vk));
}
return result;
}
/// <summary>
/// 注册热键
/// </summary>
/// <param name="id"></param>
/// <param name="fsModifiers"></param>
/// <param name="vk"></param>
/// <returns></returns>
public bool RegHotKey(int id, int fsModifiers, Keys vk)
{
return RegHotKey(id,"", fsModifiers, vk);
}
/// <summary>
/// 注册热键
/// </summary>
/// <param name="id"></param>
/// <param name="Tag"></param>
/// <param name="fsModifiers"></param>
/// <param name="vk"></param>
/// <returns></returns>
public bool RegHotKey(int id,string Tag, int fsModifiers, Keys vk)
{
if (!Enum.IsDefined(typeof(KeyModifiers), fsModifiers))
{
return false;
}
bool result = RegisterHotKey(handle, id, (KeyModifiers)fsModifiers, vk);
if (result)
{
list_hotkey.Add(new HotKeyType(id, Tag, (KeyModifiers)fsModifiers, vk));
}
return result;
}
/// <summary>
/// 获取热键数量
/// </summary>
public int Count { get { return list_hotkey.Count; } }
/// <summary>
/// 删除热键
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public bool UnHotKey(int id)
{
bool result = UnregisterHotKey(handle, id);
if (result)
{
var index = list_hotkey.FindIndex(a => a.id == id);
if (index >= 0) { list_hotkey.RemoveAt(index); }
}
return result;
}
/// <summary>
/// 删除所有热键
/// </summary>
public void UnHotKey()
{
for (int i = list_hotkey.Count - 1; i >= 0; i--)
{
HotKeyType item = (HotKeyType)list_hotkey[i];
bool result = UnregisterHotKey(handle, item.id);
if (result)
{
list_hotkey.RemoveAt(i);
}
}
}
/// <summary>
/// 删除所有热键
/// </summary>
public void Clear()
{
UnHotKey();
}
/// <summary>
/// 热键事件
/// </summary>
/// <param name="HotKeyID"></param>
public delegate void HotkeyEventHandler(int HotKeyID);
/// <summary>
/// 当使用热键时发生的事件
/// </summary>
public event HotkeyEventHandler OnHotkey;
/// <summary>
/// 热键消息过滤
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
public bool PreFilterMessage(ref System.Windows.Forms.Message m)
{
if (m.Msg == 0x312)
{
if (OnHotkey != null)
{
if (!Enabled) { return true; }
for (int i = list_hotkey.Count - 1; i >= 0; i--)
{
HotKeyType item = (HotKeyType)list_hotkey[i];
if ((UInt32)m.WParam == item.id)
{
OnHotkey((int)m.WParam);
return true;
}
//OnHotkey((int)m.WParam);
}
//OnHotkey((int)m.WParam);
}
}
return false;
}
}
/// <summary>
/// 热键类型
/// </summary>
public class HotKeyType
{
/// <summary>
/// 热键id
/// </summary>
public int id;
/// <summary>
/// 热键Tag
/// </summary>
public string Tag;
/// <summary>
/// 功能键
/// </summary>
public KeyModifiers fsModifiers;
/// <summary>
/// 普通键
/// </summary>
public Keys vk;
/// <summary>
/// 热键类型
/// </summary>
/// <param name="id"></param>
/// <param name="fsModifiers"></param>
/// <param name="vk"></param>
public HotKeyType(int id, KeyModifiers fsModifiers, Keys vk)
{
this.id = id;
this.fsModifiers = fsModifiers;
this.vk = vk;
}
/// <summary>
/// 热键类型
/// </summary>
/// <param name="id"></param>
/// <param name="Tag"></param>
/// <param name="fsModifiers"></param>
/// <param name="vk"></param>
public HotKeyType(int id,string Tag, KeyModifiers fsModifiers, Keys vk)
{
this.id = id;
this.Tag = Tag;
this.fsModifiers = fsModifiers;
this.vk = vk;
}
/// <summary>
/// 热键类型
/// </summary>
public HotKeyType()
{
}
}
}