开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 255|回复: 2
打印 上一主题 下一主题
收起左侧

[精币悬赏] GetAsyncKeyState 设置编辑框变快捷键

[复制链接]
结帖率:56% (5/9)
跳转到指定楼层
楼主
发表于 2025-5-23 14:50:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式   福建省泉州市
10精币
如标题所示
.版本 2
.支持库 shellEx
.支持库 spec

.程序集 窗口程序集_启动窗口
.程序集变量 热键标识, 整数型

.子程序 _编辑框1_放开某键, 逻辑型
.参数 键代码, 整数型
.参数 功能键状态, 整数型

编辑框1.内容 = 到文本 (键代码)

.子程序 _按钮1_被单击

撤销热键 (_启动窗口.取窗口句柄 (), 热键标识)
热键标识 = 注册热键 (_启动窗口.取窗口句柄 (), 标签1.取窗口句柄 (), 0, 到整数 (编辑框1.内容))

.子程序 _标签1_反馈事件, 整数型
.参数 参数一, 整数型
.参数 参数二, 整数型

调试输出 (“你注册的按键以响应”)




之前使用的是这个方法获取热键并实现功能开关,但是游戏内全屏没反应,有人说GetAsyncKeyState 这个调用热键可以做到,但是不会使用上面的例子去修改 有没有大佬帮忙写个看看
主要是想通过用户可以自定义热键,比如使用GetAsyncKeyState 用户在编辑框内按下需要的热键然后就可以使用户输入的这个热键变成功能的按键去开关功能

结帖率:100% (9/9)

签到天数: 3 天

沙发
发表于 2025-5-23 14:58:23 | 只看该作者   江苏省无锡市
精益模块的窗口_注册窗口热键()
对应的DLL
  
DLL命令名返回值类型公开备 注
GetAsyncKeyState整数型 取键状态
DLL库文件名:
user32.dll
在DLL库中对应命令名:
GetAsyncKeyState
参数名类 型传址数组备 注
键代码整数型vKey Long,欲测试的虚拟键的键码


回复

使用道具 举报

签到天数: 2 天

板凳
发表于 2025-5-31 19:45:54 | 只看该作者   四川省泸州市

以下是使用 GetAsyncKeyState 实现自定义热键检测的完整方案,可以解决游戏全屏模式下热键失效的问题:

.版本 2
.支持库 shellEx
.支持库 spec

.程序集 窗口程序集_启动窗口
.程序集变量 当前键码, 整数型
.程序集变量 功能开关, 逻辑型

.子程序 __启动窗口_创建完毕
    时钟1.时钟周期 = 50  ' 每50ms检测一次按键

.子程序 _编辑框1_按下某键, 逻辑型
.参数 键代码, 整数型
.参数 功能键状态, 整数型
    ' 记录用户按下的键码(排除功能键)
    .如果真 (键代码 ≠ #Ctrl键 且 键代码 ≠ #Alt键 且 键代码 ≠ #Shift键)
        当前键码 = 键代码
        编辑框1.内容 = 取键名 (键代码)
    .如果真结束
    返回 (假)  ' 禁止默认处理

.子程序 取键名, 文本型
.参数 键代码, 整数型
    .判断开始 (键代码 = #F1键)
        返回 ("F1")
    .判断 (键代码 = #F2键)
        返回 ("F2")
    ' ... 其他功能键省略
    .判断 (键代码 = #A键)
        返回 ("A")
    .判断 (键代码 = #B键)
        返回 ("B")
    ' ... 其他字母键省略
    .默认
        返回 ("[" + 到文本 (键代码) + "]")
    .判断结束

.子程序 _时钟1_周期事件
    .如果真 (当前键码 = 0)
        返回 ()
    .如果真结束

    ' 使用API检测按键状态
    .如果真 (GetAsyncKeyState (当前键码) ≠ 0)
        .如果真 (功能开关 = 假)
            功能开关 = 真
            调试输出 ("功能开启")
            ' 这里执行你的功能代码
        .如果真结束
    .否则
        .如果真 (功能开关)
            功能开关 = 假
            调试输出 ("功能关闭")
        .如果真结束
    .如果真结束

' ====== API声明 ======
.DLL命令 GetAsyncKeyState, 整数型, "user32.dll", "GetAsyncKeyState"
    .参数 键码, 整数型

方案说明

  1. 实现原理

    • 使用GetAsyncKeyStateAPI实时检测按键状态(即使窗口失去焦点)
    • 通过时钟周期性地检查按键状态
    • 用户只需在编辑框按下想要的键即可完成绑定
  2. 优势

    • ✅ 全屏游戏下可用
    • ✅ 无需注册热键,避免冲突
    • ✅ 支持组合键检测(需额外处理)
  3. 扩展组合键支持
    如果需要支持Ctrl/Alt/Shift组合键,修改时钟事件:

    .子程序 _时钟1_周期事件
       .局部变量 组合键按下, 逻辑型
    
       ' 检测组合键状态
       组合键按下 = (GetAsyncKeyState (#Ctrl键) ≠ 0 或 (GetAsyncKeyState (#Alt键) ≠ 0 或 (GetAsyncKeyState (#Shift键) ≠ 0
    
       .如果真 (当前键码 ≠ 0 且 (GetAsyncKeyState (当前键码) ≠ 0) 且 组合键按下 = 假)
           ' 触发功能...
       .如果真结束
  4. 键码对照表 易语言常量 实际键位
    #F1键 F1
    #A键 A
    #空格键 空格
    #Esc键 ESC

用户操作流程

  1. 点击编辑框
  2. 按下想要绑定的按键(如F12)
  3. 程序自动显示键名并开始检测
  4. 在游戏/其他程序中按下该键即可触发功能

注意事项

  1. 如果仍无效,尝试:

    • 降低时钟周期(如20ms)
    • 检查杀毒软件拦截
    • 游戏是否屏蔽了普通按键(某些游戏只响应DirectInput)
  2. 更完善的实现可以参考:

    ' 在_时钟1_周期事件中加入防抖处理
    .如果真 (取启动时间 () - 上次触发时间 > 200)  ' 200ms内不重复触发
       上次触发时间 = 取启动时间 ()
       ' 执行功能...
    .如果真结束

如果需要处理更复杂的游戏输入场景,可以考虑使用DirectXRaw Input方案。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:[email protected]
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表