aardio官方社区

 找回密码
 注册会员

!connect_header_login!

只需一步,快速开始

搜索
查看: 11538|回复: 17

热键发送组合键的问题,为什么不成功呢?

[复制链接]

75

主题

848

帖子

5075

积分

六级会员

The only one

Rank: 9Rank: 9Rank: 9

积分
5075
发表于 2011-2-12 20:25:23 | 显示全部楼层 |阅读模式

//打开控制台窗口
io.open()
io.print(
"正在监视按键,按ESC键退出!")

//导入HOOK库
import  key.hook
import key;
//创建录制钩子
hk = key.hook();

//录制回调函数
hk.proc=function(msg,vkcode,scancode){
   
var kn = key.getName( vkcode );
   
   
if( vkcode == key.VK.ESCAPE)
        win.quitMessage();
        
   
select(msg) {
        
case 0x100/*_WM_KEYDOWN*/ ,0x104/*_WM_SYSKEYDOWN*/ {
            
if(kn="F12"){
                io.print(
"按下F12激发热键 CTRL+SHIFT+ESC")   
                key.combine(
"CTRL","SHIFT","ESC" )
            }
        }
    }   
}

//录制需要消消息循环
import win;
win.loopMessage()

//一定要关闭钩子
hk.close();

execute("pause") //按任意键继续
io.close();//关闭控制台

  
小时候,幸福是一件东西,拥有就是幸福; 长大了,幸福是一个目标,达到就是幸福; 成熟后,发现幸福原来是一种心态,领悟就是幸福.
回复

使用道具 举报

75

主题

848

帖子

5075

积分

六级会员

The only one

Rank: 9Rank: 9Rank: 9

积分
5075
 楼主| 发表于 2011-2-12 20:26:18 | 显示全部楼层

[color=#0000ff]import[/color][color=#000000] key key.combine( [/color][color=#8

import key
key.combine(
"CTRL","SHIFT","ESC" )//这样是可以的!
小时候,幸福是一件东西,拥有就是幸福; 长大了,幸福是一个目标,达到就是幸福; 成熟后,发现幸福原来是一种心态,领悟就是幸福.
回复

使用道具 举报

40

主题

562

帖子

3035

积分

新手入门

超级初学者

积分
3035
发表于 2011-2-13 11:51:01 | 显示全部楼层

做了些试验,如果key.combine出现在按键消息回调中,没有任何效果。具体原因不明。

做了些试验,如果key.combine出现在按键消息回调中,没有任何效果。具体原因不明。
http://echong.taobao.com 各类话费充值,请多支持!
回复

使用道具 举报

12

主题

677

帖子

4033

积分

荣誉会员

子非魚、安知魚之樂

Rank: 8Rank: 8

积分
4033
发表于 2011-2-13 12:16:31 | 显示全部楼层

[quote][size=2][color=#999999]fantasynew 发表于 2011-2-13 11:51[/color] [url=forum.

fantasynew 发表于 2011-2-13 11:51
做了些试验,如果key.combine出现在按键消息回调中,没有任何效果。具体原因不明。

设置窗口前台或者焦点试试?
回复

使用道具 举报

75

主题

848

帖子

5075

积分

六级会员

The only one

Rank: 9Rank: 9Rank: 9

积分
5075
 楼主| 发表于 2011-2-13 12:36:01 | 显示全部楼层

[b]回复 [url=forum.php?mod=redirect&goto=findpost&pid=6616&ptid=999][color=Olive]f

回复 fantasynew 的帖子

按键回调消息中用函数调用  key.combine也不行!希望高手出来指点一二!

点评

你这么用和key.combine直接出现在消息回调中没区别的  发表于 2011-2-13 12:40
小时候,幸福是一件东西,拥有就是幸福; 长大了,幸福是一个目标,达到就是幸福; 成熟后,发现幸福原来是一种心态,领悟就是幸福.
回复

使用道具 举报

75

主题

848

帖子

5075

积分

六级会员

The only one

Rank: 9Rank: 9Rank: 9

积分
5075
 楼主| 发表于 2011-2-13 12:39:24 | 显示全部楼层

[b]回复 [url=forum.php?mod=redirect&goto=findpost&pid=6617&ptid=999][color=Olive]x

回复 xauto 的帖子

不想设置窗口前台或焦点,我要发送的组合键 key.combine( "CTRL" , "SHIFT" , "ESC" )也windows的全局热键,如果专指某个窗口就失去全局的意义了!
小时候,幸福是一件东西,拥有就是幸福; 长大了,幸福是一个目标,达到就是幸福; 成熟后,发现幸福原来是一种心态,领悟就是幸福.
回复

使用道具 举报

40

主题

562

帖子

3035

积分

新手入门

超级初学者

积分
3035
发表于 2011-2-13 12:42:01 | 显示全部楼层

[quote][size=2][color=#999999]xauto 发表于 2011-2-13 12:16[/color] [url=forum.php?m

xauto 发表于 2011-2-13 12:16
设置窗口前台或者焦点试试?

我实验的时候设置了延时,然后手动把控制台切换到前台,保证焦点,
也在程序的不同位置加入key.combine观察效果,才有这样的结论。
出现在消息回调之外的key.combine是有效果的
http://echong.taobao.com 各类话费充值,请多支持!
回复

使用道具 举报

75

主题

848

帖子

5075

积分

六级会员

The only one

Rank: 9Rank: 9Rank: 9

积分
5075
 楼主| 发表于 2011-3-9 00:13:57 | 显示全部楼层

老大有空看看这个问题吧?!

老大有空看看这个问题吧?!
小时候,幸福是一件东西,拥有就是幸福; 长大了,幸福是一个目标,达到就是幸福; 成熟后,发现幸福原来是一种心态,领悟就是幸福.
回复

使用道具 举报

51

主题

265

帖子

1548

积分

四级会员

Rank: 6Rank: 6

积分
1548
发表于 2011-8-4 23:59:24 | 显示全部楼层

[quote][size=2][color=#999999]look 发表于 2011-8-4 22:51[/color] [url=forum.php?mod

look 发表于 2011-8-4 22:51
这个问题,到现在还是很疑惑!虽然可以用多线程来处理这个问题,这属不属于,线程阻塞一类的问题?

也遇到过这问题,在KEY.HOOK中用按键是不行的。之前写过解决的方法,明儿找找。手机党没办法。
回复

使用道具 举报

75

主题

848

帖子

5075

积分

六级会员

The only one

Rank: 9Rank: 9Rank: 9

积分
5075
 楼主| 发表于 2011-8-4 22:51:55 | 显示全部楼层

这个问题,到现在还是很疑惑!虽然可以用多线程来处理这个问题,这属不属于,线程阻塞一类的问题?

这个问题,到现在还是很疑惑!虽然可以用多线程来处理这个问题,这属不属于,线程阻塞一类的问题?
小时候,幸福是一件东西,拥有就是幸福; 长大了,幸福是一个目标,达到就是幸福; 成熟后,发现幸福原来是一种心态,领悟就是幸福.
回复

使用道具 举报

5

主题

35

帖子

217

积分

二级会员

Rank: 3Rank: 3

积分
217
发表于 2011-8-6 10:46:07 | 显示全部楼层

[quote][size=2][color=#999999]o00viw 发表于 2011-8-4 23:59[/color] [url=forum.php?m

o00viw 发表于 2011-8-4 23:59
也遇到过这问题,在KEY.HOOK中用按键是不行的。之前写过解决的方法,明儿找找。手机党没办法。

我也想知道这个问题如何解决!
回复

使用道具 举报

30

主题

693

帖子

4168

积分

超级版主

Rank: 8Rank: 8

积分
4168
发表于 2011-8-6 11:13:32 | 显示全部楼层

[i=s] 本帖最后由 quicker 于 2011-8-6 11:35 编辑 [/i] [color=#0000ff]import[/color][colo

本帖最后由 quicker 于 2011-8-6 11:35 编辑

import  key.hook
namespace key.asyn{   
    self@ = {
        _get =
function(k){
            
if( type(..key[[k]])== type.function ){
               
return function(...){
                    ..thread.create(
                    
function(k,...){
                        
import key;
                        key[k](...)
                    }
                    ,k, ...)
                }
            }
            
return ..key[[k]];
        }
    }
/**intellisense()
key.asyn = key;
end intellisense**/

}

io.open()
io.print(
"正在监视按键,按ESC键退出!")

  
//创建录制钩子
hk = key.hook();
hk.proc=
function(msg,vkcode,scancode){
   
var kn = key.getName( vkcode );
    io.print( kn )
   
if( vkcode == key.VK.ESCAPE)
        win.quitMessage();
        
   
select(msg) {
        
case 0x100/*_WM_KEYDOWN*/ ,0x104/*_WM_SYSKEYDOWN*/ {
            
if(kn="F12"){
                io.print(
"按下F12激发热键 CTRL+SHIFT+ESC")   
                key.asyn.combine(
"CTRL","SHIFT","ESC" )   
            }
        }
    }   
}

//录制需要消消息循环
import win;
win.loopMessage()
hk.close();

execute("pause") //按任意键继续
io.close();//关闭控制台


回复

使用道具 举报

75

主题

848

帖子

5075

积分

六级会员

The only one

Rank: 9Rank: 9Rank: 9

积分
5075
 楼主| 发表于 2011-8-6 11:35:23 来自手机 | 显示全部楼层

[quote][color=#999999]quicker 发表于 2011-8-6 11:13[/color] [color=#999999]键盘一路奔跑,心

quicker 发表于 2011-8-6 11:13 键盘一路奔跑,心情愉快。 可是突然遇到了钩子,钩子掏出一把玩具枪:“打劫打劫................”

key.hook用F12钩,多线程发送CTRL+F12是不是有可能造成死循环?是不是这是不能用多线程的原因?
小时候,幸福是一件东西,拥有就是幸福; 长大了,幸福是一个目标,达到就是幸福; 成熟后,发现幸福原来是一种心态,领悟就是幸福.
回复

使用道具 举报

30

主题

693

帖子

4168

积分

超级版主

Rank: 8Rank: 8

积分
4168
发表于 2011-8-6 15:56:56 | 显示全部楼层

这个用多线程没错的

这个用多线程没错的
回复

使用道具 举报

75

主题

848

帖子

5075

积分

六级会员

The only one

Rank: 9Rank: 9Rank: 9

积分
5075
 楼主| 发表于 2011-8-6 16:07:14 | 显示全部楼层

[quote][size=2][color=#999999]quicker 发表于 2011-8-6 11:13[/color] [url=forum.php?

quicker 发表于 2011-8-6 11:13
import  key.hook
namespace key.asyn{   
    self@ = {

虽然代码量不多,但是里面的技术含量很多,有些地方不明白,还望赐教
_get
  1. _get = function(k)//这里没有...
复制代码
如何把_get元方法中的不定参数...传递进去的,这个不明白,
  1. return function(...){//这里的...是如何从_get元方法的入口形参中传入的??
  2.                     ..thread.create(
  3.                     function(k,...){
  4.                         import key;
  5.                         key[k](...)
  6.                     }
  7.                     ,k, ...)
  8.                 }
复制代码
小时候,幸福是一件东西,拥有就是幸福; 长大了,幸福是一个目标,达到就是幸福; 成熟后,发现幸福原来是一种心态,领悟就是幸福.
回复

使用道具 举报

75

主题

848

帖子

5075

积分

六级会员

The only one

Rank: 9Rank: 9Rank: 9

积分
5075
 楼主| 发表于 2011-8-6 16:12:15 | 显示全部楼层

[i=s] 本帖最后由 look 于 2011-8-6 16:13 编辑 [/i] [b][color=Red]self@[/color][/b]没有见过,开

本帖最后由 look 于 2011-8-6 16:13 编辑

self@没有见过,开来我对元方法理解的还是不够,
self@和@又有什么区别???
函数调用默认调用_get元方法,??
原来只认为只有赋值语句才会带有_get和_set元方法!
小时候,幸福是一件东西,拥有就是幸福; 长大了,幸福是一个目标,达到就是幸福; 成熟后,发现幸福原来是一种心态,领悟就是幸福.
回复

使用道具 举报

30

主题

693

帖子

4168

积分

超级版主

Rank: 8Rank: 8

积分
4168
发表于 2011-8-6 17:05:59 | 显示全部楼层

self指的是当前名字空间,在上面就是表示key.asyn self@ 也就等价于 ..key.asyn@ 名字空间也是一个table,可以用元表重


self指的是当前名字空间,在上面就是表示key.asyn
self@ 也就等价于 ..key.asyn@

名字空间也是一个table,可以用元表重载操作符,修改默认行为.
_get 是修改成员操作符的默认行为

你可以把key.asyn理解为一个代理、一个跳板。
你在读取 key.asyn.combine 的时候, key.asyn一看他自已没有这个成员,
他就去调用 key.asyn@._get( "combine" ) 并返回值.

key.asyn@._get 被调用了,他很高兴.
但是他也没有"combine"这个函数,他就找 ..key 要去了, 于是他找到了 ..key.combine
可是他没有直接把 ..key.combine 返回, 他在函数外面加了个外壳函数, 再把这个壳函数返回.

结果用户每次调用的时候, 就必须先调用这个壳函数了.
壳函数可以干很多事,例如修改参数, 添加行为, 产生很多有趣的效果.

至于三圆点(...), 表示是不定个数的参数. javascript中有个类似的arguments.  
js的arguments结合apply,call( aardio中也有个用法很接近的call函数 ) 也可以实现类似的壳函数, 非常有意思( 伟大的arguments... )

听起来很复杂,其实非常简单,多动手折腾,很快就能搞明白。

回复

使用道具 举报

75

主题

848

帖子

5075

积分

六级会员

The only one

Rank: 9Rank: 9Rank: 9

积分
5075
 楼主| 发表于 2011-8-6 20:24:20 | 显示全部楼层

[i=s] 本帖最后由 look 于 2011-8-6 20:24 编辑 [/i] [quote][size=2][color=#999999]quicker

本帖最后由 look 于 2011-8-6 20:24 编辑
quicker 发表于 2011-8-6 17:05
self指的是当前名字空间,在上面就是表示key.asyn
self@ 也就等价于 ..key.asyn@

其他的都明白了,还有一处不明白,还请赐教

namespace key.asyn{   
    self@ = {
        _get =
function(k){//这里的k只传入了combine,这里是整个_get元方法的入口,没有传入"CTRL","SHIFT","ESC"
            ..io.print(k);
            ..io.print(
"调用元方法")
            
if( type(..key[[k]])== type.function ){
               
//返回一个形参为不定参数的匿名函数 (不定参数的用法我明白)
                return function(...){//这里的...是怎么传入的"CTRL","SHIFT","ESC"的?
                    //匿名函数内创建线程
                    ..thread.create(
                    
function(k,...){
                        ..io.print(k,...);
                        ..io.print(
"创建线程")
                        
import key;
                        key[k](...)
                    }
                    ,k, ...)
                }
            }
            
return ..key[[k]];
        }
    }
/**intellisense()
key.asyn = key;
end intellisense**/

}



小时候,幸福是一件东西,拥有就是幸福; 长大了,幸福是一个目标,达到就是幸福; 成熟后,发现幸福原来是一种心态,领悟就是幸福.
回复

使用道具 举报

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

本版积分规则

未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2021-9-25 02:36 , Processed in 0.085785 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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