delphi中有模拟发送鼠标按键sendmessage的疑问
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi中有模拟发送鼠标按键sendmessage的疑问相关的知识,希望对你有一定的参考价值。
在delphi中有一个模拟发送鼠标按键的功能,比如:
sendmessage(hookHwnd,messages.WM_LBUTTONDOWN ,0,$007B024B);// 按下鼠标左键
sendmessage(hookHwnd,messages.WM_LBUTTONUP ,0, $007B024B); //抬起鼠标左键
因为我的鼠标坐标是随机产生的,$007B024B这个数值不固定,我就想使用下面这方式来动态获取$007B024B这个值
Var x,y:integer;
x16,y16,m:string;
mm:integer;
x:=587;//x坐标,随机产生
y:=123;//y坐标,随机产生
x16:=inttohex(x,4);//将x坐标转换为16进制,值为:024B
y16:=inttohex(y,4);//将y坐标转换为16进制,值为:007B
m:='$'+x16+y16;//整合为一个字符串:$007B024B,这里现在是一个字符串,我如何才能将这个字符串转换为整数$007B024B
mm:=strtoint(m);//这里出错...因为m这个数值里含有字母,就算是不含有字母,也会转换为其他数字,最终转换出来的不是$007B024B这个值
//mm := (y shl 16) or x;//用这种方式得到的数值也不是$007B024B这个,
sendmessage(hookHwnd,messages.WM_LBUTTONDOWN ,0,mm);// 按下鼠标左键
sendmessage(hookHwnd,messages.WM_LBUTTONUP ,0, mm); //抬起鼠标左键
大家帮忙看看怎么解决,或者是有其他什么方式替换呢,谢谢哦
x,y,lParam:Cardinal;
begin
x:=587;//x坐标,随机产生
y:=123;//y坐标,随机产生
lParam:=(y shl 16) or x;
sendmessage(hookHwnd,messages.WM_LBUTTONDOWN,0,lParam); // 按下鼠标左键
sendmessage(hookHwnd,messages.WM_LBUTTONUP,0,lParam); //抬起鼠标左键
end; 参考技术A 使用MakeWord 作成高低字节 而不是十六进制
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消息、或者改善的办法、求指教、谢谢、
注:按键精灵可以实现操作、
要解决这个问题,必须是直接采用IO拦截。但是IO拦截不能在Ring3下使用,必须是Ring0,也就是必须写驱动(.sys)来拦截。
或者采用提权手法把自己的Ring3程序提权到Ring0,但是这种方法一般正规程序都不会用,会被系统、杀毒软件等拦截。
所以唯一的办法就是写驱动。 参考技术A 游戏的键盘输入采用的是DirectInput,和GDI的键盘原理是不一样的,所以不能用sendkey之类的三层GDI API。
要解决这个问题,必须是直接采用IO拦截。但是IO拦截不能在Ring3下使用,必须是Ring0,也就是必须写驱动(.sys)来拦截。
或者采用提权手法把自己的Ring3程序提权到Ring0,但是这种方法一般正规程序都不会用,会被系统、杀毒软件等拦截。
所以唯一的办法就是写驱动。追问
谢了。那请问按键精灵是怎么实现的呢?
追答没用过,不知道
本回答被提问者采纳 参考技术B 出现“Privileged instruction 错误”的错误情况一般是:在释放某对象之前就释放了它的Owner。
仔细检查你的代码看看有没有上述情况。 参考技术C mouse_event直接就可以模拟鼠标点击啊,这个是整个系统有效的。模拟点击不需要用钩子啊,你又不需要截获鼠标消息 sendmesage();
以上是关于delphi中有模拟发送鼠标按键sendmessage的疑问的主要内容,如果未能解决你的问题,请参考以下文章
delphi 模拟键盘法对当前窗口鼠标左键单击最小化怎么做?