页游做的好的是哪个网站手机设置管理网站

张小明 2026/1/9 10:33:37
页游做的好的是哪个网站,手机设置管理网站,站长工具查询官网,网站建设专业团队全局键盘钩子Rouyan中是在 KeySequenceService.cs 中实现的#xff0c;全局键盘钩子通过 Windows API 实现#xff0c;允许应用程序监听系统级的键盘事件#xff0c;而不受窗口焦点限制。1、Win32 API 导入类中导入了必要的 Windows API 函数#xff1a;SetWindowsHookEx全局键盘钩子通过 Windows API 实现允许应用程序监听系统级的键盘事件而不受窗口焦点限制。1、Win32 API 导入类中导入了必要的 Windows API 函数SetWindowsHookEx安装钩子UnhookWindowsHookEx卸载钩子CallNextHookEx将钩子传递给下一个处理器GetModuleHandle获取模块句柄[DllImport(user32.dll)]public static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);[DllImport(user32.dll)]public static extern bool UnhookWindowsHookEx(IntPtr hhk);[DllImport(user32.dll)]public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);[DllImport(kernel32.dll)]public static extern IntPtr GetModuleHandle(string lpModuleName);现在先来学习一下这几个函数1、SetWindowsHookEx[DllImport(user32.dll)]public static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);用途安装钩子过程到钩子链中。钩子允许应用程序拦截和处理系统消息或事件。参数idHook (int)钩子类型。对于低级键盘钩子使用常量 WH_KEYBOARD_LL 13。lpfn (LowLevelKeyboardProc)指向钩子过程的指针。在代码中传递 HookCallback 方法。hMod (IntPtr)包含钩子过程的模块句柄。使用 GetModuleHandle 获取当前模块句柄。dwThreadId (uint)要关联钩子的线程 ID。设为 0 表示全局钩子所有线程。返回值成功时返回钩子句柄 (IntPtr)失败时返回 IntPtr.Zero。在代码中的应用在 SetHook 方法中调用用于安装低级键盘钩子使应用程序能监听系统级键盘事件。2、UnhookWindowsHookEx[DllImport(user32.dll)]public static extern bool UnhookWindowsHookEx(IntPtr hhk);用途从钩子链中移除指定的钩子过程。必须在使用完毕后调用以释放系统资源。参数hhk (IntPtr)要移除的钩子句柄。由 SetWindowsHookEx 返回。返回值成功时返回 true失败时返回 false。在代码中的应用在 Dispose 方法中调用确保应用程序退出时正确卸载钩子避免内存泄漏和系统级问题。3、CallNextHookEx[DllImport(user32.dll)]public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);用途将钩子信息传递给钩子链中的下一个钩子过程。这是钩子链机制的核心确保所有钩子都能处理消息。参数hhk (IntPtr)当前钩子的句柄可选通常设为当前钩子句柄。nCode (int)钩子代码指示如何处理消息。wParam (IntPtr)消息的 WPARAM 参数。lParam (IntPtr)消息的 LPARAM 参数。返回值下一个钩子过程的返回值。在代码中的应用在 HookCallback 方法末尾调用确保处理完自定义逻辑后将消息传递给系统或其他钩子。4、GetModuleHandle[DllImport(kernel32.dll)]public static extern IntPtr GetModuleHandle(string lpModuleName);用途检索指定模块的模块句柄。模块句柄用于标识 DLL 或 EXE 文件。参数lpModuleName (string)模块名称不含路径。如果为 null返回调用进程的主模块句柄。返回值成功时返回模块句柄 (IntPtr)失败时返回 IntPtr.Zero。在代码中的应用在 SetHook 方法中调用获取当前进程主模块的句柄作为 SetWindowsHookEx 的 hMod 参数用于关联钩子到当前应用程序模块。具体实现先总体看一下KeySequenceService类做了什么1、注册/卸载全局键盘钩子2、拦截按键并用状态机识别序列3、将“Tab 字母”组合映射到 8 个动作4、保持系统钩子链2-4就是在钩子回调中做的事。一些常量设置// 低级键盘钩子常量private const int WH_KEYBOARD_LL 13;private const int WM_KEYDOWN 0x0100;// 按键常量Tab 字母 序列private const int VK_TAB 0x09;private const int VK_K 0x4B;private const int VK_L 0x4C;private const int VK_U 0x55;private const int VK_I 0x49;private const int VK_S 0x53;private const int VK_D 0x44;private const int VK_W 0x57;private const int VK_E 0x45;// 序列超时时间毫秒private const int SEQUENCE_TIMEOUT_MS 2000;private const int WH_KEYBOARD_LL 13;含义Win32 的“低级键盘钩子”类型常量。用于安装系统范围的键盘事件回调。低级键盘钩子是什么意思“低级键盘钩子”WH_KEYBOARD_LL是 Windows 提供的一种全局键盘事件拦截机制。通过 Win32 API 在用户态安装后系统在键盘事件产生时会优先回调你提供的函数让你的程序有机会观察、处理甚至拦截按键再将事件传递给系统或其他钩子。用途作为 SetWindowsHookEx 的 idHook 参数安装键盘钩子。private const int WM_KEYDOWN 0x0100;含义键盘“按下”消息常量。用途在钩子回调中过滤只处理按下事件。剩下的是虚拟键码与序列超时时间。注册/卸载全局键盘钩子构造阶段准备钩子回调与委托防 GCpublic delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);public KeySequenceService(){_proc HookCallback;}private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam){if (nCode 0 wParam (IntPtr)WM_KEYDOWN){int vkCode Marshal.ReadInt32(lParam);HandleKeyDown(vkCode);}return CallNextHookEx(_hookID, nCode, wParam, lParam);}HookCallback 的作用是作为 WH_KEYBOARD_LL 低级键盘钩子的回调入口按键事件一到达就被它截获、筛选并转交给序列状态机处理最后把事件继续传给系统的下一枚钩子。注册键盘钩子public void RegisterHotKeys(){try{_hookID SetHook(_proc);if (_hookID IntPtr.Zero){Console.WriteLine(警告: 无法安装全局键盘钩子);}else{Console.WriteLine(全局热键已注册\n TabK (RunLLMPrompt1)\n TabL (RunLLMPrompt1Streaming)\n TabU (RunLLMPrompt2)\n TabI (RunLLMPrompt2Streaming)\n TabS (RunVLMPrompt1)\n TabD (RunVLMPrompt1Streaming)\n TabW (RunVLMPrompt2)\n TabE (RunVLMPrompt2Streaming));}}catch (Exception ex){Console.WriteLine($注册热键失败: {ex.Message});}}private IntPtr SetHook(LowLevelKeyboardProc proc){using var curProcess System.Diagnostics.Process.GetCurrentProcess();using var curModule curProcess.MainModule;if (curModule?.ModuleName ! null){return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);}return IntPtr.Zero;}其中核心代码是return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);。意思是安装低级键盘钩子并返回钩子句柄proc就是钩子的回调方法然后传入当前这个模块0表示对系统范围内所有线程生效全局钩子。卸载键盘钩子public void Dispose(){try{if (_hookID ! IntPtr.Zero){UnhookWindowsHookEx(_hookID);_hookID IntPtr.Zero;Console.WriteLine(全局热键已卸载);}}catch (Exception ex){Console.WriteLine($清理热键资源时出错: {ex.Message});}}钩子回调private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam){if (nCode 0 wParam (IntPtr)WM_KEYDOWN){int vkCode Marshal.ReadInt32(lParam);HandleKeyDown(vkCode);}return CallNextHookEx(_hookID, nCode, wParam, lParam);}private void HandleKeyDown(int vkCode){switch (_currentMode){case HotkeyMode.None:if (vkCode VK_TAB){_currentMode HotkeyMode.WaitingAfterTab;_sequenceStartTime DateTime.Now;Console.WriteLine(检测到 Tab 键等待按下后续字母键...);}break;case HotkeyMode.WaitingAfterTab:if (IsTimeout()){Console.WriteLine(按键序列超时);}else{switch (vkCode){case VK_K:Console.WriteLine(检测到完整组合键 TabK执行 RunLLMPrompt1...);ExecuteAction(_runLLMPrompt1);break;case VK_L:Console.WriteLine(检测到完整组合键 TabL执行 RunLLMPrompt1Streaming...);ExecuteAction(_runLLMPrompt1Streaming);break;case VK_U:Console.WriteLine(检测到完整组合键 TabU执行 RunLLMPrompt2...);ExecuteAction(_runLLMPrompt2);break;case VK_I:Console.WriteLine(检测到完整组合键 TabI执行 RunLLMPrompt2Streaming...);ExecuteAction(_runLLMPrompt2Streaming);break;case VK_S:Console.WriteLine(检测到完整组合键 TabS执行 RunVLMPrompt1...);ExecuteAction(_runVLMPrompt1);break;case VK_D:Console.WriteLine(检测到完整组合键 TabD执行 RunVLMPrompt1Streaming...);ExecuteAction(_runVLMPrompt1Streaming);break;case VK_W:Console.WriteLine(检测到完整组合键 TabW执行 RunVLMPrompt2...);ExecuteAction(_runVLMPrompt2);break;case VK_E:Console.WriteLine(检测到完整组合键 TabE执行 RunVLMPrompt2Streaming...);ExecuteAction(_runVLMPrompt2Streaming);break;default:Console.WriteLine($检测到 Tab 后的无效按键: {vkCode});break;}}ResetState();break;}// 检查超时并重置状态if (_currentMode ! HotkeyMode.None IsTimeout()){Console.WriteLine(按键序列超时);ResetState();}}只处理键盘按下消息类型然后根据不同的快捷键组合调用不同的方法。private void ExecuteAction(Action action){try{// 在UI线程上执行操作Application.Current?.Dispatcher.BeginInvoke(new Action(() {try{action?.Invoke();}catch (Exception ex){Console.WriteLine($执行热键操作时出错: {ex.Message});}}), DispatcherPriority.Normal);}catch (Exception ex){Console.WriteLine($调度热键操作时出错: {ex.Message});}}在HotkeyService中对热键做了管理/// summary/// 初始化热键服务/// /summary/// param namemainWindow主窗口/parampublic void Initialize(Window mainWindow){try{// 初始化Tab字母组合键服务_keySequenceService new KeySequenceService(ExecuteRunLLMPrompt1,ExecuteRunLLMPrompt1Streaming,ExecuteRunLLMPrompt2,ExecuteRunLLMPrompt2Streaming,ExecuteRunVLMPrompt1,ExecuteRunVLMPrompt1Streaming,ExecuteRunVLMPrompt2,ExecuteRunVLMPrompt2Streaming);_keySequenceService.RegisterHotKeys();// 初始化全局ESC键服务_globalEscService new GlobalEscService();_globalEscService.Register();}catch (Exception ex){Console.WriteLine($初始化热键服务失败: {ex.Message});}}把具体要执行的方法传进去/// summary/// 执行RunLLMPrompt1操作/// 当检测到 TabK 组合键时调用/// /summaryprivate async void ExecuteRunLLMPrompt1(){try{var homeViewModel _container.GetHomeViewModel();if (homeViewModel ! null){await homeViewModel.RunLLMPrompt1();}else{Console.WriteLine(警告: 无法获取HomeViewModel实例);}}catch (Exception ex){Console.WriteLine($执行TabK热键操作失败: {ex.Message});}}在Bootstrapper中初始化这个热键服务protected override void OnLaunch(){// 初始化和获取全局快捷键服务try{var _hotkeyService this.Container.GetHotkeyService();if (Application.Current?.MainWindow ! null){_hotkeyService.Initialize(Application.Current.MainWindow);}}catch (Exception ex){Console.WriteLine($初始化全局快捷键失败: {ex.Message});}}然后就成功实现了按下设定的快捷键就会触发特定的方法。用Rouyan举个例子就是按下tab l快捷键时就会自动弹出流式窗口根据提示词的内容对剪贴板中的内容进行处理如下所示然后按下esc就会关闭这个窗口实现思路是一样的代码我写到了GlobalEscService中关键代码如下所示private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam){if (nCode 0 wParam (IntPtr)WM_KEYDOWN){int vkCode Marshal.ReadInt32(lParam);// 检查是否按下了ESC键if (vkCode VK_ESCAPE){// 查找并关闭ShowMessageView窗口CloseShowMessageWindow();}}return CallNextHookEx(_hookID, nCode, wParam, lParam);}/// summary/// 查找并关闭ShowMessageView窗口/// /summaryprivate void CloseShowMessageWindow(){// 在UI线程上执行窗口查找和关闭操作Application.Current.Dispatcher.Invoke(() {// 遍历所有打开的窗口foreach (Window window in Application.Current.Windows){// 检查是否是ShowMessageView类型的窗口if (window is Rouyan.Pages.View.ShowMessageView showMessageWindow){showMessageWindow.Close();break; // 找到并关闭后退出循环}}});}
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

上海住房与建设部网站wordpress 获取文章列表

思维链技术:让AI推理过程从黑箱变透明的革命性突破 【免费下载链接】fabric fabric 是个很实用的框架。它包含多种功能,像内容总结,能把长文提炼成简洁的 Markdown 格式;还有分析辩论、识别工作故事、解释数学概念等。源项目地址&…

张小明 2026/1/4 11:23:34 网站建设

wordpress文章调用插件最新seo快排技术qq

QML与C深度集成:构建高性能、高内聚的现代应用架构在现代应用开发领域,我们面临着双重挑战:一方面,用户对界面的美观度、流畅度和交互体验提出了前所未有的高要求;另一方面,应用的底层逻辑需要处理海量数据…

张小明 2026/1/7 15:37:06 网站建设

网站用asp还是php设计师用的装修设计软件

毕业设计实战:基于SpringBootMySQL的流浪动物管理系统设计与实现,从需求到测试全流程拆解,新手也能轻松通关! 谁懂啊!当初做流浪动物管理系统毕设时,光“宠物领养表”和“领养审核表”的外键关联就卡了3天—…

张小明 2026/1/9 9:31:28 网站建设

创建网站用英语怎么说广告推广服务平台

Equalizer APO终极指南:免费系统级音频均衡器快速上手 【免费下载链接】equalizerapo Equalizer APO mirror 项目地址: https://gitcode.com/gh_mirrors/eq/equalizerapo 想要提升电脑音质却不知从何入手?Equalizer APO作为一款完全免费的开源系统…

张小明 2026/1/7 3:22:24 网站建设

网站备案需要花钱吗正邦集团招聘

一、需求理解关于 Stable Diffusion 3.5 FP8 版本在游戏设计、广告创意、艺术创作等领域的应用案例分享,本文将从技术特性、各领域落地场景、实操代码、效果对比等维度,全面解析 SD3.5 FP8 的应用价值。二、Stable Diffusion 3.5 FP8 核心特性铺垫1.1 FP…

张小明 2026/1/5 23:20:48 网站建设

正能量网站入口直接进入下载深圳手机网站建设牛商网

实习,是连接校园与职场的桥梁,是学生将理论知识付诸实践、积累宝贵经验的关键阶段。然而,当实习结束,面对一份需要上交的“实践报告”时,许多同学却感到无从下手。如何将零散的工作内容、琐碎的日常事务,提…

张小明 2026/1/6 20:06:48 网站建设