VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 443|回复: 5

[交流] 迷茫了,还是易语言比较方便啊,C++太难了!

[复制链接]
63_avatar_middle
最佳答案
1 
donate_vip 发表于 2020-4-8 15:47:17 | 显示全部楼层 |阅读模式

实现一个鼠标连点器,在易语言中,是用了超级模块中的 监控热键功能


源码如下:

  1. .版本 2

  2. .子程序 监视热键, 整数型, 公开, 监视一个热键,当热键被触发时激活响应事件.(成功返回热键标识,失败返回0).注:必须真实的按键才会触发热键
  3. .参数 响应事件, 子程序指针, , 响应事件(热键标识,其它...),事件参数数目不限!如果再次监视热键将响应事件!
  4. .参数 键代码, 整数型, , 触发事件的基本键,事件在基本键按下时触发,负数为放开时触发,1鼠标左键,2鼠标右键,更多查询相关帮助
  5. .参数 功能键状态, 整数型, 可空, 1 Alt  2 Ctrl  4 Shift  8 Win 若要两个或以上的状态键,则把它们的值相加.
  6. .参数 其它键, 整数型, 可空, 如果你需要注册由两个普通键组合的热键,可设置一个其它键代码.
  7. .参数 周期, 整数型, 可空, 默认为10,监视热键的周期时间(建议5-200之间)
  8. .参数 直接触发, 逻辑型, 可空, 默认为假:创建新的线程事件 真:直接调用事件等待返回
  9. .局部变量 临时热键信息, 热键信息2
  10. .局部变量 i, 整数型

  11. .如果真 (到字节 (取绝对值 (键代码)) ≤ 0)
  12.     返回 (0)
  13. .如果真结束
  14. .计次循环首 (取数组成员数 (监视热键_信息), i)
  15.     .如果真 (监视热键_信息 [i].普通键 = 键代码 且 监视热键_信息 [i].功能键 = 功能键状态 且 监视热键_信息 [i].其它键 = 其它键)
  16.         监视热键_信息 [i].事件子程序 = 响应事件
  17.         监视热键_信息 [i].直接触发 = 直接触发
  18.         .如果真 (监视热键_信息 [i].标识 ≠ 0)
  19.             返回 (监视热键_信息 [i].标识)  ' 已经注册过的热键,返回热键标识
  20.         .如果真结束
  21.         监视热键_信息 [i].标识 = i + 1000000
  22.         返回 (监视热键_信息 [i].标识)
  23.     .如果真结束

  24. .计次循环尾 ()
  25. 临时热键信息.事件子程序 = 响应事件
  26. 临时热键信息.普通键 = 键代码
  27. 临时热键信息.功能键 = 功能键状态
  28. 临时热键信息.其它键 = 其它键
  29. 临时热键信息.直接触发 = 直接触发
  30. 临时热键信息.标识 = 取数组成员数 (监视热键_信息) + 1000001
  31. 加入成员 (监视热键_信息, 临时热键信息)
  32. .如果真 (临时热键信息.标识 = 1000001)
  33.     _创建定时器 (0, 16661, 选择 (周期 ≤ 0, 10, 周期), &监视热键线程)
  34. .如果真结束
  35. 返回 (临时热键信息.标识)
复制代码


实现鼠标连点的功能易语言代码:

  1. .版本 2

  2. 监视热键 (&监控子程序, #F9键)
  3. 监视热键 (&暂停, #F10键)
复制代码


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

  3. .子程序 监控子程序
  4. .局部变量 临时句柄, 整数型
  5. .局部变量 图坐标, 坐标型
  6. .局部变量 i, 整数型
  7. .局部变量 单色, 字节型
  8. .局部变量 收钱按钮, 坐标型


  9. 收分 = 真
  10. ' WINIO.锁定鼠标 (假)
  11. ' 子程序_用户登录 ()
  12. 临时句柄 = 取当前窗口 ()
  13. ' 临时句柄 = 进程取句柄 (“Catchfish.run”,, “猎鱼达人3D”)
  14. ' 临时句柄 = 取句柄 (“Catchfish.run”, , “猎鱼达人3D”)
  15. 调试输出 (临时句柄)
  16. 窗口激活 (临时句柄)
  17. 窗口移动 (临时句柄, 0, 0)

  18. .判断开始 (单选框1.选中 = 真)  ' 拿货
  19.     .判断循环首 (收分 = 真)
  20.         鼠标移动 (, 370, 327)
  21.         鼠标键 ()
  22.         超级延时 (800)
  23.     .判断循环尾 ()

  24. .判断 (单选框2.选中 = 真)  ' 出货

  25.     .判断循环首 (收分 = 真)
  26.         鼠标移动 (, 807, 326)
  27.         鼠标键 ()
  28.         超级延时 (800)
  29.         鼠标移动 (, 712, 604)
  30.         鼠标键 ()

  31.         超级延时 (800)



  32.     .判断循环尾 ()

  33. 实际效果很好,稳定实用。

复制代码


在C++中因为没有直接的类似于  监控热键的调用,也没有类似于想 易语言模块
可以直接实现该功能,因此用了


  1. void CCatchFishToolDlg::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2)
  2. {
  3.         // TODO: 在此添加消息处理程序代码和/或调用默认值

  4.         MyClass my;
  5.         if (nHotKeyId==1000)
  6.         {
  7.                 bTakeGoods = TRUE;
  8.                

  9.                 HWND hWnd = ::FindWindow(_T("UnityWndClass"), _T("猎鱼达人3D"));
  10.                 my.Win_SetPosSize(hWnd, 0, 0, NULL, NULL); //移动窗口到0,0位置


  11.                 if (m_rad_take.GetCheck())  //拿货被勾选
  12.                 {
  13.                         m_edt_state.SetSel(-1);
  14.                         m_edt_state.ReplaceSel(_T("开始拿货...\r\n"));
  15.                         KillTimer(2);
  16.                         Sleep(1000);

  17.                         SetTimer(1, 800, NULL);  //拿货
  18.                         /*while (bTakeGoods)
  19.                         {
  20.                                 //SetCursorPos(370, 327);
  21.                         //mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
  22.                         ////模拟鼠标的所有事件
  23.                         //Sleep(50);
  24.                         //mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
  25.                         //Sleep(800);
  26.                         }*/
  27.                         //在热键响应消息函数中,用while循环中执行动作时,是无法在响应
  28.                         //全局热键了
  29.                         //因此只能采用 时间控件来执行循环动作


  30.                 }
  31.                 else if (m_rad_save.GetCheck())
  32.                 {
  33.                         m_edt_state.SetSel(-1);
  34.                         m_edt_state.ReplaceSel(_T("开始存入仓库...\r\n"));
  35.                         KillTimer(1);
  36.                         Sleep(1000);
  37.                         SetTimer(2, 800, NULL);  //拿货
  38.                        

  39.                 }
  40.                


  41.         }
  42.         else if (nHotKeyId==2000)
  43.         {
  44.                 /*bTakeGoods = FALSE;*/

  45.                 KillTimer(1);
  46.                 KillTimer(2);

  47.                 m_edt_state.SetSel(-1);
  48.                 m_edt_state.ReplaceSel(_T("暂停\r\n") );
  49.         }




  50.         CDialogEx::OnHotKey(nHotKeyId, nKey1, nKey2);
  51. }


  52. void CCatchFishToolDlg::OnDestroy()
  53. {
  54.         CDialogEx::OnDestroy();

  55.         // TODO: 在此处添加消息处理程序代码

  56.         UnregisterHotKey(m_hWnd,1000);
  57.         UnregisterHotKey(m_hWnd, 2000);



  58. }
复制代码


并在 timer 中实现执行代码,可是效果很差,不知道是什么原因



  1. void CCatchFishToolDlg::OnTimer(UINT_PTR nIDEvent)
  2. {
  3.         // TODO: 在此添加消息处理程序代码和/或调用默认值

  4.         switch (nIDEvent)
  5.         {
  6.         case 1:
  7.         {
  8.                 SetCursorPos(370, 327);
  9.                 Sleep(100);
  10.                 mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
  11.                 //模拟鼠标的所有事件
  12.                 Sleep(100);
  13.                 mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

  14.         }
  15.         case 2:
  16.         {
  17.                 SetCursorPos(807, 326);
  18.                 Sleep(100);
  19.                 mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
  20.                 //模拟鼠标的所有事件
  21.                 Sleep(100);
  22.                 mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
  23.                 Sleep(800);

  24.                 SetCursorPos(712, 604);
  25.                 Sleep(100);
  26.                 mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
  27.                 //模拟鼠标的所有事件
  28.                 Sleep(100);
  29.                 mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
  30.         }



  31.         default:
  32.                 break;
  33.         }




  34.         CDialogEx::OnTimer(nIDEvent);
  35. }
复制代码


经过,这样的对比,没有英语基础的编程初学者还是学习易语言速度会更快一些!
也倡议C++的大牛能多分享一些大家共用的类库、COM接口、dll库中实现更多的,类似于 易语言模块
的集中了很多功能,如:本文中的  监视热键 功能函数。。。

也就是说,制作这个用 热键响应的鼠标连点器,用易语言只需要 10分钟左右就写好了。
而C++就需要找大量的资料,先实现 这个 监视热键的功能,然后才能实现 这个简单的功能。
哎。。。。。迷茫了,还是易语言比较方便啊,C++太难了!








上一篇:清明,以国之名,举国致哀!不忘记每一个因疫情逝去的人
下一篇:(C语言)csv文件数据分析比较!
16_avatar_middle
最佳答案
0 
在线会员 发表于 2020-4-8 20:33:32 | 显示全部楼层
亲戚问:做啥的呀现在; 我回答:做易语言; 亲戚:.....
亲戚问:做啥的呀现在; 我回答:做C++; 亲戚:C++牛逼啊
77_avatar_middle
最佳答案
31 
online_vip 发表于 2020-4-8 16:35:06 | 显示全部楼层
从上面你粘贴出来的文本的角度来说,看你C++的代码并没有比易语言的多哪去!实际上代码量差不多。其实还是你用易语言用习惯了,遇到什么问题直接查找库有没有提供类似的功能,有的话直接调用了。而C++中暂时没有这样的现成的库,所以楼主得自己明白如何注册热键,如何实现模拟鼠标点击。

用易语言的话可能就相当于码农,只要调用库中的接口,直接堆代码,把逻辑写完就好了,不用深入的了解技术细节。C++的话就得知道具体功能的实现细节才行。

上面C++的问题在于楼主每次触发热键之后都去重新启动一个定时器来操作,本身定时器的优先级就比较低,所以这块不建议用这种方式来做,可以考虑用线程来做,这样实时性高一些,热键和线程之间的通信可以用个带锁的消息队列,这样实现出来的效果会比较好!

评分

参与人数 1驿站币 +2 收起 理由
63_avatar_small safeboy + 2

查看全部评分

89_avatar_middle
最佳答案
0 
在线会员 发表于 2020-4-9 07:30:46 | 显示全部楼层
Met32 发表于 2020-4-8 20:33
亲戚问:做啥的呀现在; 我回答:做易语言; 亲戚:.....
亲戚问:做啥的呀现在; 我回答:做C++; 亲戚: ...

太真实了。666啊迷茫了,还是易语言比较方便啊,C++太难了!
20_avatar_middle
最佳答案
0 
在线会员 发表于 2020-4-9 21:45:29 | 显示全部楼层
太真实了。666啊
85_avatar_middle
最佳答案
3 
在线会员 发表于 2020-4-9 23:27:58 | 显示全部楼层
易语言 1入门快 2写点软件还可以 速度快
但是不利于理解底层知识.
调试也不能多线程调试.
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-10-28 18:53

Powered by CcTry.CoM

© 2009-2020 cctry.com

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