Node监听鼠标键盘事件,定时发消息小程序,解决robotjs不支持输入汉字问题!

2020-04-27 16:57:15

参考地址 Node监听鼠标键盘事件,定时发消息小程序,解决robotjs不支持输入汉字问题!

吹啊!吹啊!我骄傲的放纵··· 写了一上午长篇大论,中午出去吃个饭回了都没了,桑心,蛋疼,心烦,心烦,心烦ing 说了多少遍叫我月城少主!月城少主!!!

开启第一步:nodejs实现复制文本到剪切板!

缘由: 为啥要复制到粘贴板呢,缘由就是robotjs这货不支持输入中文,这个没法说毕竟编程还是老外居多,期间我尝试用 pinyin+空格 按键组合; 就这pinyin能打出多少种情况,, 想想还是算了吧!

思路 定时发消息的思路是这个样子滴 ;用nodejs脚本发请求,并要写的东西放到电脑ctrl+c的内存里面;于是我只用在调试代码中,ctrl+v就行了。当然一切都是程序自己来;说到这里好多人就不用往下看了,因为一切都太简单了;但是有时候看看比较好 毕竟做了才看到有几个坑;

非常简单的功能,但nodejs没有提供。但不要绝望因为nodejs可以调用系统命令,而系统命令中有不少可以操作剪切板的命令,由于系统是windows,所以考虑使用windows cmd命令中的clip,来实现复制到剪切板的功能。


const exec = require(‘child_process').exec;

exec(‘echo 123456 | clip');

1

2

这个就可以了,超级简单啦,这里有问题来了,但这个命令的执行结果,有个我无法忍受的bug:复制出来的文本,最后有个换行符(echo造成的)!


const exec = require('child_process').exec;

exec('<nul (set/p z=123456) | clip');

1

2

So 这样呢,黏贴出来的东西后面有一个空格;这东西没啥大问题反正本人是接受了,不避免有些人无法接受,下面我就告诉大家 那个方法百度一下 到处都是复制就能用;虽然不想说 因为我是不想用 费那么大劲,占那么大内存就为了去一个空格,而且一般程序无影响, 哎 还是复制过来白话一下吧;


// 简单的复制文本到剪切板的函数,参数依次是文本,成功回调

var copyToClipboard = function(text, func) { 

 // 这种方式最完美,但最麻烦

 // 会生成一个批处理文件,一个文本文件,以批处理文件复制文件文件的内容,后又需要删除两个文件。

 var temp = 'txt_' + Date.now() + '.txt';


 var str = `@echo off

<nul (set/p z=${text}) > ${temp} 

clip < ${temp} 

del ${temp}

`;

// 这句加入批处理,会导致报错,虽然能执行(复制)成功。原因应该是,del批处理文件自身的时候,nodejs还在使用他

// 'del "%~f0"';

 var cmdFile = 'ttzkxlcjv.cmd';

 fs.writeFile(cmdFile, str);

 exec(cmdFile, function(err, stdout, stderr) {

 if (err || stderr) return console.log(err, stdout, stderr);

 // 用nodejs删除文件

 fs.unlink(cmdFile);

 func(text, stdout);

 });

};

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

可以聊一聊基本思路嘛,就是用nodejs的文件读取fs模块 创建一个txt文件把你所写的东西写进去;再用cmd clip的另一个用法,即 clip < a_text.txt,这样会将后面这个文件的内容,复制出来。 这里面还有个小坑。即在批处理文件中,加入del “%~f0”删除自身,本来是可以用的,但在nodejs里执行却会报错,应该是因为批处理文件在执行到删除自身的命令时,进程还被nodejs引用着结果报错了。只有调用nodejs的fs.unlink命令,删除那个批处理文件。


开启第二步:nodejs实现ctrl+v!

一如既往 我开启我得尝试精神; 上期里面不就说了 有一个robot.keyTap("enter"); 就是执行回车的么,脑洞一开 robot.keyTap("ctrl+v"); 是不是就ok了;但是结果不如意啊!不会怎么办?百度啊!啥 百度不到 呃呃 那就翻墙; 翻墙没找到,, 没办法扒源码吧 一翻果然 被我找到一句 t.ok(robot.keyTap("a", "control") === 1, 'successfully tapped "ctrl+a".'); 一看跑不了,就是它; 不明白写程序这个人怎么想的 明明知道 ctrl+a 那个 ctrl非要写成control ··· 在这种情况可以应付一些情况 加一个定时器就可以自己玩耍;鼠标焦点在哪他就一直向里面写东西了;但是有些人就想什么13:14 什么5:21发个消息,那么咱们也就搞一搞!


开启第三步:关于node定时任务发布(后台还是很常用滴)!

安装 npm install node-schedule 就可以了。


1:确定时间


    例如:2022年2月2日,22:22 22毫秒执行


    var schedule = require("node-schedule");


    var date = new Date(2022,2,22,22,22,22);


    var j = schedule.scheduleJob(date, function(){

    console.log("执行任务");

  });


    取消任务


    j.cancel();

1

2

3

4

5

6

7

8

9

10

11

12

13

2:每小时的固定时间


  例如:每小时的40分钟执行


  var rule = new schedule.RecurrenceRule();


  rule.minute = 40;

  //每隔 30 分钟执行

    rule.minute = [0, 30];

    //每隔 15 分钟执行:

     rule.minute = [0, 15, 45];


  var j = schedule.scheduleJob(rule, function(){


    console.log("执行任务");


  });

1

2

3

4

5

6

7

8

9

10

11

12

13

3:一个星期中的某些天的某个时刻执行,


  例如:周一到周日的20  

  

  var rule = new schedule.RecurrenceRule();


  rule.dayOfWeek = [0, new schedule.Range(1, 6)];


  rule.hour = 20;


  rule.minute = 0;


  var j = schedule.scheduleJob(rule, function(){


    console.log(“执行任务”);


  });

  


4 :每秒执行


  var rule = new schedule.RecurrenceRule();


  var times = [];


  for(var i=1; i<60; i++){


    times.push(i);


  }


  rule.second = times;


  var c=0;

  var j = schedule.scheduleJob(rule, function(){

        c++;

        console.log(c);

  });

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

啥? 你想每分钟执行一下,不会? 推荐使用setInterval !!! 话说着说着我就想起 林俊杰的一首歌 Always Oline 你说你一个一直在线的人,人都挂了还在线,绝壁的程序员,还是高程,显然定时任务完不成啊,也许主人公前几年就把人工智能玩66的 只是不幸挂了,想到这里 国家不幸失去以为人才,为祖国感到悲伤 · · · 悲伤结束 看看代码 好像还缺点东西,咱们给加上触发事件吧 ,要不然那些整蛊的人不想用定时任务靠 一个定时器 在哪里走, 开完程序赶紧把 鼠标放回 太 太 乐 哈哈!


Nodejs事件监听键盘按键,鼠标事件;

这个监听事件 不在event模块里面哦!这种资料很难找 在百度都是event监听事件没有node监听键盘鼠标事件 解释也太少,为啥啊? nodejs主做后端,毕竟这种东西偏向dom了嘛, 下面的代码就可以监听键盘上 你输入的按键啦!


var keypress = require('keypress');


keypress(process.stdin);

process.stdin.on('keypress', function (ch, key) {

  console.log('got "keypress"', key);

  if (key && key.ctrl && key.name == 'c') {

    process.stdin.pause();

  }

});


process.stdin.setRawMode(true);

process.stdin.resume();

1

2

3

4

5

6

7

8

9

10

11

12

以下这段代码 据说可以检测鼠标按下的事件;亲测 没好使··· 反正我只要找一个触发条件,键盘事件够用了 代码给大家看看 省的你们翻墙去了 也许是我的版本问题吧。。


var keypress = require('keypress');


// 做的过程。stdin的开始发出“mousepress”(和“键盘按键”)事件

keypress(process.stdin);


//您必须启用鼠标事件之前就将开始点击

keypress.enableMouse(process.stdout);


process.stdin.on('mousepress', function (info) {

  console.log('got "mousepress" event at %d x %d', info.x, info.y);

});


process.on('exit', function () {

  // 禁用鼠标在退出时,终端stateis恢复正常

  keypress.disableMouse(process.stdout);

});

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

完成的代码


//定时任务小程序!


/*第一步 --nodejs实现复制文本到剪切板*/

const exec = require('child_process').exec,

    robot = require("robotjs"),

    keypress = require('keypress');


keypress(process.stdin);


// listen for the "keypress" event 

process.stdin.on('keypress', function(ch, key) {

    if (key && key.ctrl && key.name == 'c') {

        process.stdin.pause();

    }

    console.log('got "keypress"', key);

    if(key.sequence == '\t') {


        //初始化时间

        var a = parseInt(3000);

        exec('<nul (set/p z=月城大人大驾光临! ) | clip');


        //定时器

        setInterval(function() {

            if (a!=3000) {

                //粘贴板文字

                exec('<nul (set/p z=月城大人回来了 距离上次回来时间:' + a + '毫秒) | clip');

            }



            robot.keyTap("v", "control");


            robot.keyTap("enter");


            a = parseInt(1000 * Math.random() + 1000);


        }, a);


    }

});


process.stdin.setRawMode(true);

process.stdin.resume();

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

俺们主要目的就是娱乐骚扰好友,就不用定时任务了;你们也可以把预划的东西写下来 挨个执行;加个好友! 不是有好多交友软件 就是这种傻瓜程序嘛 就是比我的高级一些 多了两个监听嘛!下载软件 加上好友之后···

第一局: 你好 我是小丽,很高兴认识你,我是单身哦;

五秒过后

第二句: 我很无聊呢,你多大了呢;

再有五秒,十秒,

第三局:我是 哪里哪里人 你呢?

第四局 :“您的消息没有发出去呢?请充值为会员 多少 多少 钱!”


别问我怎么知道。。 看朋友这么聊的 哈哈哈哈 · · ·


我不会生产技术,我只是一个技术的搬运工 ,非常感谢看到这里的朋友,祝大家工作顺心,生活愉快 


  • 2019-12-03 16:36:03

    跨域资源共享 CORS 详解

    阮一峰大哥的文章写的不错,推荐,也推荐他的整个王章,大家可以去看一下啊。

  • 2019-12-03 16:37:01

    去除options,减少options的访问

    因为跨域请求,浏览器可能(后面讲)会发送一次options请求,如果处理不好,跨域还是会gg的。 之前很少涉及跨域,涉及也是简单请求(下面阮老师文章中区别热简单请求和复杂请求),所以基本不会很少关注options。后面就遇到坑了,下面讲讲注意点。

  • 2019-12-04 10:46:26

    nuxt.js项目中全局捕获异常并生成错误日志全过程

     需求:客户在使用过程中页面报错时,可以生成错误记录传回服务器,以便改进。   步骤:     一.全局捕获异常,     二.发送到服务端,     三.生成错误日志。   一.全局捕获异常 如图,vue提供了errorHandle这个方法来处理全局异常,更多详细内容参见官网。

  • 2019-12-04 10:47:59

    nuxt.js项目中全局捕获异常并生成错误日志全过程

     需求:客户在使用过程中页面报错时,可以生成错误记录传回服务器,以便改进。   步骤:     一.全局捕获异常,     二.发送到服务端,     三.生成错误日志。   一.全局捕获异常 如图,vue提供了errorHandle这个方法来处理全局异常,更多详细内容参见官网。

  • 2019-12-04 10:48:18

    vue 项目资源文件 static 和 assets 不说区别直接使用?

    assets中资源会webpack构建压缩到你代码中,而static文件直接引用。 static 中长存放类包、插件等第三方的文件,assets里放属资源文件比如自己资源图片、css文件、js文件。 引入资源的方式static文件夹可以使用~/static/方式引入, assets文件夹可以使用 ~@/assets 方式引入

  • 2019-12-05 17:01:36

    Vue 结合 Axios 接口超时统一处理

    当网路慢的时候。又或者公司服务器不在内地的时候,接口数据请求不回来超时报错的情况相信大家肯定遇到过的,这里我把我公司项目请求超时的处理方法分享下,希望看过后有帮助。