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

解决方案 »

  1.   

    在这儿附上我的有问题的代码(只是关键部分):
    这是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.
      

  2.   

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

  3.   

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

  4.   

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

  5.   

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

  6.   

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

  7.   

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

  8.   

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