CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  Windows SDK/API

初学HOOK,我编了一个按键精灵程序,有一个小问题.请大家帮帮忙.

楼主coldwindtang(风)2005-06-03 00:28:48 在 Delphi / Windows SDK/API 提问

我用DLL方式实现的,所以只要按了指定的启动键,就会自动运行一系列的模拟键盘的操作.  
  可是有时候,我们希望这样的操作一系列操作一直不停地执行,直到我们按了定义的"终止键"  
  后才停止.  
  这样就有一个问题,我怎么让我的按键精灵实现这个功能呢?  
  我想的是设一个全局的变量,然后在一个死循环里检查这个变量,如果这个变量改变了就跳出  
  这个死循环.然后再在另一个地方让我们按了"终止键"后即把这个全局变量改变.这样就实现  
  了我事先想好的功能.  
  可是,我在实现中发现,如果只是一个DLL的话,因为开始已经进入死循环了,所以后来我的按键  
  它也没有处理了,但是我如果写两个DLL的话,怎么做到共享变量呢?而且我看按键精灵程序只  
  有一个DLL存在,所以应该可以用一个DLL实现这个功能的.  
  哪个高手能给一点指导?最好有一些专对性的代码最好.  
  谢谢!  
  问题点数:0、回复次数:10Top

1 楼coldwindtang(风)回复于 2005-06-03 00:31:47 得分 0

在这儿附上我的有问题的代码(只是关键部分):  
  这是DLL部分代码,ctrl+c启动,只是模拟鼠标点击而已。设想的是按ctrl+x退出。  
  gameover为我说的那个全局变量。  
  unit   HKkeyProc;  
  interface  
  uses  
  Windows,   Messages;  
  var  
  hNextHookProc:   HHook;  
  procSaveExit:   Pointer;  
  gameover:   boolean;  
   
  function   KeyboardHookHandler(iCode:   integer;   wParam:   WPARAM;   lParam:   LPARAM):LRESULT;stdcall;   export;  
  function   EnableHotKeyHook:BOOL;Export;  
  function   DisableHotKeyHook:BOOL;export;  
  procedure   HotKeyHookExit;   far;  
   
  implementation  
   
  function   keyboardHookHandler(iCode:   integer;   wParam:   WPARAM;   lParam:   LPARAM):LRESULT;stdcall;   export;  
  const  
  _keypressMaSK   =   $80000000;  
  begin  
  result:=0;  
  if   icode<0   then  
  begin  
        result:=CallNextHookEx(hNextHookProc,icode,wParam,lparam);                      
  exit;  
  end;  
   
          if   ((lparam   and   _KeyPressMask)=0)  
                          and(getkeystate(vk_control)<0)  
                          and(wParam=Ord('C'))  
                          then  
  begin  
  result:=1;  
  gameover:=true;  
  while   gameover   do  
  begin  
  Mouse_Event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);  
                        Mouse_Event(MOUSEEVENTF_LEFTUP,0,0,0,0);  
                        sleep(2000);  
                        end;  
  end  
        else  
        begin  
        gameover:=false;  
        end;          
  end;  
   
  function   Enablehotkeyhook:   bool;   export;  
  begin  
  result:=false;  
  if   hnexthookproc<>0   then   exit;  
   
  hnexthookproc:=setwindowshookex(WH_KEYBOARD,   KeyboardHookHandler,   Hinstance,   0);  
  result:=   hnextHookProc<>0;  
  end;  
  function   Disablehotkeyhook:BOOL;   export;  
  begin  
  if   hNextHookProc   <>   0   then  
  begin  
  UnhookWindowshookEx(hNextHookProc);  
  hNexthookProc:=0;  
  Messagebeep(0);  
  end;  
  result:=HnextHookproc=0;  
  end;  
  procedure   hotkeyhookexit;  
  begin  
  if   hNexthookProc<>0   then   DisableHotkeyHook;  
  exitproc:=procSaveExit;  
  end;  
  end.  
  Top

2 楼fffddd(假钞换贞操)回复于 2005-06-03 01:09:54 得分 0

帮你UP!Top

3 楼kongguangming(Fly)回复于 2005-06-03 09:38:12 得分 0

共享变量可以用文件映射,不过在hookdll里不要用循环,可以另开一个进程实现鼠标操作。(你好象在点广告啊)Top

4 楼unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回复))回复于 2005-06-03 10:14:46 得分 0

启动之后应该是启动一个线程去做循环(即线程执行体),这样子外部才能够更好的掌控,直接操作这个线程就好了,也不至于在Hook里面死锁。Top

5 楼coldwindtang(风)回复于 2005-06-03 12:40:21 得分 0

unsigned(僵哥)   具体怎么做啊?是在DLL中做吗?那我不是还得先学多线程?不会啊~  
   
  kongguangming(Fly)文件映射是把共享的变量放在文件中吗?那样不是会很慢?"另开一个进程实现鼠标操作",那怎么控制这个进程呢?那就是多线程吧?  
   
  可不可以不用多线程来做呢?Top

6 楼sdzeng(大头鸟)回复于 2005-06-03 15:10:26 得分 0

Windows中进程(Process)和线程(thread)是不一样的  
  多个dll或exe中全局变量要用到内存文件映射,  
  操作的不是文件  
  建议看看《Windows核心编程》  
  Top

7 楼coldwindtang(风)回复于 2005-06-03 22:06:45 得分 0

《Windows核心编程》是谁写的?在哪儿可以买到呢?  
  有没有让我这个新手能一下子写出按键精灵的方法呢?我其他部分都写出来了.  
  Top

8 楼5207(踏雪)回复于 2005-06-03 22:43:52 得分 0

最好不要死循环.可以给个条件,比如最多多少次,或者多少时间!  
  你的循环放在子线程当中,此时整个进程都会挂起,但是放在了线程中就能中调用DLL来中断整个进程了.  
   
  Top

9 楼5207(踏雪)回复于 2005-06-03 22:45:12 得分 0

补充下,我的意思是说把你的循环放在一个线程当中.这样主线程就能被DLL中断了.Top

10 楼coldwindtang(风)回复于 2005-06-04 11:18:53 得分 0

那还是得用多线程对吧?Top

相关问题

  • 怎么得到当前按键的keycode(初学)
  • java能编按键精灵之类的软件么
  • 用java能不能写按键精灵啊
  • 本人初学DELPHI:关于模拟键盘按键的问题,帮我UP,入即给分,急急急。。。。
  • 请教用VB实现按键精灵的功能(100分,可以再加)
  • 试过很多方法,未能实现,初学用HOOK
  • 怎么让钩子(HOOK) 截获按键,并转化为别的按键!
  • 请问有没有类似于“按键精灵”这样的英文版的键盘鼠标软件?
  • 请问这样的软件免费发布算不算侵权?我用VB做了一个类似按键精灵的软件,界面和功能都和按键精灵相似。
  • 键盘HOOK如何能截获DOS程序的按键?

关键词

  • 精灵
  • 线程
  • 循环
  • dll
  • 映射
  • 文件
  • 多线程
  • 鼠标
  • 代码
  • hnexthookproc

得分解答快速导航

  • 帖主:coldwindtang

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo