delphi 模拟按键问题
赛车游戏挂机自动按键(xp系统)、
keybd_event、SendInput、被屏蔽、均无法对正在游戏按键(聊天时输入框却可以实现按键)、
改用winio模拟、没开游戏时用记事本测试正常、一旦运行游戏就会出现‘特权指令’(privileged instruction)异常、
{ asm
PUSH EAX
PUSH EDX
@Loop:
IN AL,$64//词句问题
AND AL,01b
JNZ @Loop
MOV AL,Cod
MOV DL,Por
MOV DH,0
OUT DX,AL
POP EDX
POP EAX
end;
}
(查到有人这么说:out和in汇编指令在Window2000以上Ring3(普通级别)不能再使用,如果要使用,必须进入Ring0指令级别(操作系统级),驱动程序工作在Ring0级别下.)
不明白其意思、
有什么其他方法、绕过Windows消息、或者改善的办法、求指教、谢谢、
注:按键精灵可以实现操作、
追问:谢了。那请问按键精灵是怎么实现的呢?
答案:游戏的键盘输入采用的是DirectInput,和GDI的键盘原理是不一样的,所以不能用sendkey之类的三层GDI API。
要解决这个问题,必须是直接采用IO拦截。但是IO拦截不能在Ring3下使用,必须是Ring0,也就是必须写驱动(.sys)来拦截。
或者采用提权手法把自己的Ring3程序提权到Ring0,但是这种方法一般正规程序都不会用,会被系统、杀毒软件等拦截。
所以唯一的办法就是写驱动。
其他:出现“Privileged instruction 错误”的错误情况一般是:
在释放某对象之前就释放了它的Owner。
仔细检查你的代码看看有没有上述情况。 mouse_event直接就可以模拟鼠标点击啊,这个是整个系统有效的。模拟点击不需要用钩子啊,你又不需要截获鼠标消息 sendmesage();
上一个:delphi数据库编程,ADO+SQL,高手进!
下一个:Delphi二维表不显示数据库内容!!!