比如我在Resources中添加了一个App.jpg文件,那么如果我想获得这个文件可以这样获得:

代码
StreamResourceInfo info = System.Windows.Application.GetResourceStream(new Uri("/项目名字;component/Resources/App.jpg", UriKind.Relative));
System.Drawing.Image.FromStream(info.Stream);
有一点需要注意的是图片的生成操作要设置为Resource方式。
添加如下类:

代码
/// <summary>
/// 直接构造类实例即可注册
/// 自动完成注销 ,热键会随着程序结束自动解除,不会写入注册表
/// 注意注册时会抛出异常
/// </summary>
class HotKey
{
#region Member
int KeyId ; //热键编号
IntPtr Handle ; //窗体句柄
Window window ; //热键所在窗体
uint Controlkey ; //热键控制键
uint Key ; //热键主键
public delegate void OnHotkeyEventHandeler(); //热键事件委托
public event OnHotkeyEventHandeler OnHotKey=null; //热键事件
static Hashtable KeyPair = new Hashtable(); //热键哈希表
private const int WM_HOTKEY = 0x0312; // 热键消息编号
public enum KeyFlags //控制键编码
{
MOD_ALT = 0x1,
MOD_CONTROL = 0x2,
MOD_SHIFT = 0x4,
MOD_WIN = 0x8
}
#endregion
/// <summary>
/// 构造函数
/// </summary>
/// <param name="win">注册窗体</param>
/// <param name="control">控制键</param>
/// <param name="key">主键</param>
public HotKey(Window win, HotKey.KeyFlags control, Keys key)
{
Handle = new WindowInteropHelper(win).Handle;
window=win;
Controlkey = (uint)control;
Key = (uint)key;
KeyId=(int)Controlkey+(int)Key*10;
if (HotKey.KeyPair.ContainsKey(KeyId))
{
throw new Exception("热键已经被注册!");
}
//注册热键
if(false == HotKey.RegisterHotKey(Handle, KeyId, Controlkey, Key))
{
throw new Exception("热键注册失败!");
}
if(HotKey.KeyPair.Count==0){
//消息挂钩只能连接一次!!
if(false == InstallHotKeyHook(this))
{
throw new Exception("消息挂钩连接失败!");
}
}
//添加这个热键索引
HotKey.KeyPair.Add(KeyId, this);
}
#region core
[System.Runtime.InteropServices.DllImport("user32")]
private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint controlKey, uint virtualKey);
[System.Runtime.InteropServices.DllImport("user32")]
private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
//安装热键处理挂钩
static private bool InstallHotKeyHook(HotKey hk)
{
if (hk.window == null || hk.Handle==IntPtr.Zero)
return false;
//获得消息源
System.Windows.Interop.HwndSource source = System.Windows.Interop.HwndSource.FromHwnd(hk.Handle);
if (source==null) return false;
//挂接事件
source.AddHook(HotKey.HotKeyHook);
return true;
}
//热键处理过程
static private IntPtr HotKeyHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == WM_HOTKEY)
{
HotKey hk = (HotKey)HotKey.KeyPair[(int)wParam];
if (hk.OnHotKey != null) hk.OnHotKey();
}
return IntPtr.Zero;
}
//析构函数,解除热键
~HotKey()
{
HotKey.UnregisterHotKey(Handle, KeyId);
}
#endregion
}
使用方法:在load事件中使用(不要在构造函数中使用,因为此时句柄还没有创建好)

代码
void Window1_Loaded(object sender, RoutedEventArgs e)
{
HotKey key = new HotKey(this, HotKey.KeyFlags.MOD_CONTROL, Keys.T);
key.OnHotKey += new HotKey.OnHotkeyEventHandeler(key_OnHotKey);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器