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

唐巧 2005-06-03 12:28:48
我用DLL方式实现的,所以只要按了指定的启动键,就会自动运行一系列的模拟键盘的操作.
可是有时候,我们希望这样的操作一系列操作一直不停地执行,直到我们按了定义的"终止键"
后才停止.
这样就有一个问题,我怎么让我的按键精灵实现这个功能呢?
我想的是设一个全局的变量,然后在一个死循环里检查这个变量,如果这个变量改变了就跳出
这个死循环.然后再在另一个地方让我们按了"终止键"后即把这个全局变量改变.这样就实现
了我事先想好的功能.
可是,我在实现中发现,如果只是一个DLL的话,因为开始已经进入死循环了,所以后来我的按键
它也没有处理了,但是我如果写两个DLL的话,怎么做到共享变量呢?而且我看按键精灵程序只
有一个DLL存在,所以应该可以用一个DLL实现这个功能的.
哪个高手能给一点指导?最好有一些专对性的代码最好.
谢谢!
...全文
445 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐巧 2005-06-04
  • 打赏
  • 举报
回复
那还是得用多线程对吧?
唐巧 2005-06-03
  • 打赏
  • 举报
回复
unsigned(僵哥) 具体怎么做啊?是在DLL中做吗?那我不是还得先学多线程?不会啊~

kongguangming(Fly)文件映射是把共享的变量放在文件中吗?那样不是会很慢?"另开一个进程实现鼠标操作",那怎么控制这个进程呢?那就是多线程吧?

可不可以不用多线程来做呢?
唐巧 2005-06-03
  • 打赏
  • 举报
回复
在这儿附上我的有问题的代码(只是关键部分):
这是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.
5207 2005-06-03
  • 打赏
  • 举报
回复
补充下,我的意思是说把你的循环放在一个线程当中.这样主线程就能被DLL中断了.
5207 2005-06-03
  • 打赏
  • 举报
回复
最好不要死循环.可以给个条件,比如最多多少次,或者多少时间!
你的循环放在子线程当中,此时整个进程都会挂起,但是放在了线程中就能中调用DLL来中断整个进程了.

僵哥 2005-06-03
  • 打赏
  • 举报
回复
启动之后应该是启动一个线程去做循环(即线程执行体),这样子外部才能够更好的掌控,直接操作这个线程就好了,也不至于在Hook里面死锁。
唐巧 2005-06-03
  • 打赏
  • 举报
回复
《Windows核心编程》是谁写的?在哪儿可以买到呢?
有没有让我这个新手能一下子写出按键精灵的方法呢?我其他部分都写出来了.
kongguangming 2005-06-03
  • 打赏
  • 举报
回复
共享变量可以用文件映射,不过在hookdll里不要用循环,可以另开一个进程实现鼠标操作。(你好象在点广告啊)
sdzeng 2005-06-03
  • 打赏
  • 举报
回复
Windows中进程(Process)和线程(thread)是不一样的
多个dll或exe中全局变量要用到内存文件映射,
操作的不是文件
建议看看《Windows核心编程》
fffddd 2005-06-03
  • 打赏
  • 举报
回复
帮你UP!

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧