Delphi 中 鼠标的移动消息

我用functionShowCurInfoThread.LastInput:DWord;varLInput:TLastInputInfo;beginLInput.cbSi... 我用function ShowCurInfoThread.LastInput: DWord;
var
LInput: TLastInputInfo;
begin
LInput.cbSize := SizeOf(TLastInputInfo);
GetLastInputInfo(LInput);
Result := GetTickCount - LInput.dwTime;
end;来获取鼠标键盘空闲的时间,现在我不动鼠标及键盘,希望向系统发送消息来模拟鼠标或键盘的输入,从而让这个函数得到的值为0,请问有什么办法,该怎么写代码,希望具体一点。
展开
 我来答
己闻楣Sx
2011-06-23 · TA获得超过1935个赞
知道大有可为答主
回答量:1057
采纳率:93%
帮助的人:906万
展开全部
核心方法是调用API——SendInput,简单举例如下:
var
rInput : TInput;
......
FillChar( rInput, SizeOf( rInput ), 0 );
rInput.Itype := INPUT_MOUSE; // 鼠标消息
rInput.mi.dx := 0; // 指针横坐标
rInput.mi.dy := 0; // 指针纵坐标
rInput.mi.dwFlags := MOUSEEVENTF_MOVE; // 移动指针
SendInput( 1, @rInput, SizeOf( rInput ) ); // 发送消息(鼠标)

FillChar( rInput, SizeOf( rInput ), 0 );
rInput.Itype := INPUT_KEYBOARD; // 键盘消息
rInput.ki.wVk := VK_LEFT; // 左箭头的键码
rInput.ki.dwFlags := KEYEVENTF_KEYUP; // 指示键被抬起,如没有本行,则表示按下
SendInput( 1, @rInput, SizeOf( rInput ) ); // 发送消息(左箭头)

更详细的例子不大好弄,和具体意图十分相关,还是看看MSDN关于SendInput、MOUSEINPUT、KEYBDINPUT的说明吧。

需要注意的是发送鼠标消息时,指针坐标是虚拟坐标系——[ 0, 0 ]~[ 65535, 65535 ],而不是显卡、屏幕分辨率数值范围,因此,需要类似如下方法进行转换。
procedure ClientToVirtual( const H : HWND; const PMI : PMouseInput );
const
{ 鼠标指针坐标采用虚拟坐标系:[ 0, 0 ] ~ [ 65535, 65535 ] }
{ 参见API函数SendInput }
C_n_VirtualWidth = 65536;
C_n_VirtualHeight = 65536;
var
P : TPoint;
begin
P.X := PMI.dx;
P.Y := PMI.dy;
ClientToScreen( H, P );
PMI.dx := P.X * C_n_VirtualWidth div Screen.Width;
PMI.dy := P.Y * C_n_VirtualHeight div Screen.Height;
end;
该函数涉及到一个窗口句柄,它的获得可以通过调用EnumWindow枚举、调用FindWindow查找,也可以设为通过其它方法了解到的立即数(如Spy++等),一般来说,发送消息是要指定向谁发送的,但SendInput接口中没有HWND参数,就需要调用SetForegroundWindow把期望的窗口提升到顶层......

综上,弄这个还是需要掌握不少相关知识的,没有什么捷径,看MSDN实乃正解。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式