hook注册热键实现隐藏窗口等

学了几天的易语言,发现一个基本的辅助操作,就是按键呼出,然后自己就像这是怎么实现的。中途找了N多资料,这里我真的很想吐槽一下,当然仅仅代表个人看法,各种资料都是些封装的模块,也没有合适的反编译易语言模块来看高手写的代码让我这菜鸟来学习,但是吧,总觉得不开源出来很多东西会越来越封闭,掌握在少数人手里和大家一起开发维护,我这里不评价好坏,纯属个人很厌烦这种行为吧。so.....咋办,那就自己直接撸代码开干呗,这里又想吐槽,不是看不起易语言,只是觉得编译器很蠢,或许是自己不会用太蠢了吧,提示内容提示出来按回车不给我填上第一条内容反而要我在按一次方向键选中第一个内容,还有方法里继续调方法的时候,居然没有方法名提示了,还有选中方法的时候,居然不给我自动填充括号,还有更多等待发掘。

好了说正事吧。开发一个软件的时候,最先的应该是需求,我们的要求很简单,就是按某键呼出隐藏窗口,那么如何实现呢,楼主遍寻资料啊,直接用人家的模块,楼主有点小倔强,就像自己来,这里我们不扯调windowsAPI。但起码有个人的看法。

楼主思路很菜鸟,windows是事件消息处理机制,那我直接就注册热键监听热键消息呗,然后开始苦寻API,耗时较多的是在API用法上面,因为楼主学java的,很是不能理解windowsapi里的这种写法,比如  peekMessage(msg,hwnd,整数,整数)  居然是自己传一个空windows定义的空Msg对象进去,对比java中,一般是传一些需要的参数,然后返回我要的对象。这个API试了我大半天的时间,只能怪自己有点蠢吧,不过发现坑爹问题。getMessage API会阻塞当前线程,这样的话就又把方案整理成,主线程运行,子线程做阻塞监听按键消息,可是在这里把自己又难倒了,子线程获取不到主线程的按键消息,然后又一顿API查找找了个啥AttachThreadInput 连接主线程的API,据说可以共享消息一些东西,果断尝试,百思不得其解,发现主线程注册的热键,子线程硬是拿不到,然后子线程又尝试注册热键,发现没有办法注册,然后死在这里。。

不甘心啊,第二天觉得自己不应该这么牛角尖,果断继续想方案,然后找资料各种听说hook技术,哎,思路来了,我hook住热键消息,交给自己管理,那就不需要自己去监视了,系统给我回调函数,卧槽。果断发现这个API相当的nice,然后一顿操作,发现嘿嘿,成了。但是又觉得这样不能提供给别人用啊。太硬了。当然这中间又发现个问题,就是易语言不像java一样可以通过反射技术调用某个类的方法,不得不逼自己明明hook住了,还要在弄一个钩子链来执行其他用户注册进来的函数,so,low逼的我做的很Low逼,弄了两个钩子才完成这个隐藏并且别人可以使用,并且用来执行用户想执行的函数。贴源码。

 

 

下图的1637808其实是参数6的值,这个值需要替换你程序运行的值。

 

代码是新鲜出炉的所有一些参数没有很明确说明,但是嘛。仅供参考嘛,要是我自己当时能有源码,我觉得学习起来肯定是飞速的。。奈何。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力回答你的问题。 首先,WinHook 是一个用于Windows操作系统的钩子库,它允许你监视和控制系统中发生的事件。使用WinHook,你可以捕捉和处理各种系统事件,如键盘和鼠标输入,窗口消息等。 要实现在按下Home键时呼出隐藏窗口,你需要创建一个钩子函数来捕捉Home键的按下事件。以下是一个基本的WinHook钩子函数的示例代码: ``` ' 定义钩子回调函数 Declare Function HookProc Lib "user32.dll" Alias "CallNextHookEx" (ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long ' 定义钩子ID常量 Const WH_KEYBOARD_LL = 13 ' 定义键盘事件常量 Const WM_KEYDOWN = &H100 Const WM_SYSKEYDOWN = &H104 ' 定义键盘事件数据结构 Type KBDLLHOOKSTRUCT vkCode As Long scanCode As Long flags As Long time As Long dwExtraInfo As Long End Type ' 声明全局变量 Dim hHook As Long ' 钩子回调函数 Function KeyboardHook(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Dim HookData As KBDLLHOOKSTRUCT If nCode = HC_ACTION Then If wParam = WM_KEYDOWN Or wParam = WM_SYSKEYDOWN Then ' 捕捉Home键按下事件,显示隐藏窗口 HookData = ByVal lParam If HookData.vkCode = vbKeyHome Then ' 显示隐藏窗口的代码 ... End If End If End If ' 调用下一个钩子函数 KeyboardHook = HookProc(nCode, wParam, lParam) End Function ' 安装钩子函数 Function InstallHook() As Boolean hHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf KeyboardHook, App.hInstance, 0) If hHook <> 0 Then InstallHook = True Else InstallHook = False End If End Function ' 卸载钩子函数 Function UninstallHook() As Boolean If UnhookWindowsHookEx(hHook) <> 0 Then UninstallHook = True Else UninstallHook = False End If End Function ``` 在上面的代码中,我们定义了一个名为KeyboardHook的钩子回调函数,用于捕捉按键事件。在钩子回调函数中,我们检查按键事件的vkCode是否为vbKeyHome,如果是,就执行显示隐藏窗口的代码。 要安装钩子函数,我们调用SetWindowsHookEx函数,并将WH_KEYBOARD_LL作为钩子类型传入。要卸载钩子函数,我们调用UnhookWindowsHookEx函数,传入钩子句柄hHook。 以上是使用WinHook控件实现在按下Home键时呼出隐藏窗口的基本代码示例,你可以根据自己的需要进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值