初学HOOK,我编了一个按键精灵程序,有一个小问题.请大家帮帮忙.
我用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




