VFP 后台模拟鼠标!

yrt888 2010-10-30 10:29:44
用 keybd_event 可以实现前台模拟鼠标动作,但当窗口最小化或隐藏后,就不行了,于是就想到后台模拟鼠标点击某窗口某点!
在网上找了一大轮,只找到 SendMessage 和 POSTMESSAGE (还不知行不行,不过还得先试一试!)

SendMessage(handle,wm_lbuttondown,MK_LBUTTON,Y*2^16+x)

上一行是用 SendMessage 函数来点击某窗口某点的例句,我理解的是这样:
SendMessage(handle,0x201,0,Y*2^16+x)

关键是第四个参数,是传递坐标值的,在VFP 下如定义这个参数和如何传递这个参数?

DECLARE Long SendMessage IN WIN32API Long, Long, Long, Long

这样定义不知对不对,因为第四个参数还可这样定义: String @

还有如何方便计算某窗口某点的坐标,我目前了解的函数是 DECLARE INTEGER GetWindowRect IN user32;
INTEGER hwnd,;
STRING @ lpRect

这个函数可以取得窗口的屏幕位置大小!

先谢谢各位老师大侠的帮助!
...全文
426 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yrt888 2010-10-31
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 apple_8180 的回复:]
如:

WM_LBUTTONDOWN = 0x0201
WM_LBUTTONUP = 0x0202
MK_LBUTTON = 0x0001

Declare Long SendMessage In WIN32API Long, Long, Long, Long
SendMessage(Thisform.HWnd,WM_LBUTTONDOWN,MK_LBUTTON,20*2^16+30……
[/Quote]

赶回来,先学习一下,谢谢!
十豆三 2010-10-31
  • 打赏
  • 举报
回复
如:

WM_LBUTTONDOWN = 0x0201
WM_LBUTTONUP = 0x0202
MK_LBUTTON = 0x0001

Declare Long SendMessage In WIN32API Long, Long, Long, Long
SendMessage(Thisform.HWnd,WM_LBUTTONDOWN,MK_LBUTTON,20*2^16+30) && 按下左键(或20**256*256+30)
SendMessage(Thisform.HWnd,WM_LBUTTONUP,MK_LBUTTON,20*2^16+30) && 放开左键

注:
20*2^16+30中的 20是相对 Thisform.HWnd 窗体的Y坐标,30是相对 Thisform.HWnd 窗体的X坐标, 不是相对屏幕左上角。
lc_apple 2010-10-31
  • 打赏
  • 举报
回复
vfp泪流满面、伤心地说:
“玩数据库我行!玩别的我不专业啊!”
yrt888 2010-10-31
  • 打赏
  • 举报
回复
忙到现在才有空试验,是成功的,不过有个现象要处理,明天再问,谢谢!
yrt888 2010-10-30
  • 打赏
  • 举报
回复
外出有点事!
yrt888 2010-10-30
  • 打赏
  • 举报
回复
传递这个cBuffer 往往是把已知的坐标传递过去,如何把比如(338,833)这种坐标值传进去!
yrt888 2010-10-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 apple_8180 的回复:]
API
ClientToScreen
ScreenToClient

是将 屏幕坐标 和 用户坐标 进行转换的
[/Quote]

现在剩下 SendMessage 的第四个参数的定义和传递了,网上有例子,不知能否通用:

cBuffer = REPLICATE(Chr(0), 8)
= GetCursorPos(@cBuffer)
= ScreenToClient(THIS.hForm, @cBuffer)

能否变成这样呢:

DECLARE Long SendMessage IN WIN32API Long, Long, Long, String @

SendMessage(handle,0x201,0,@cBuffer)
yrt888 2010-10-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 apple_8180 的回复:]
API
ClientToScreen
ScreenToClient

是将 屏幕坐标 和 用户坐标 进行转换的
[/Quote]

有这个,取坐标就好办了!
十豆三 2010-10-30
  • 打赏
  • 举报
回复
API
ClientToScreen
ScreenToClient

是将 屏幕坐标 和 用户坐标 进行转换的
十豆三 2010-10-30
  • 打赏
  • 举报
回复
Declare Integer GetWindowRect In user32 Integer HWnd,String @lpRect
lcRect=Replicate(Chr(0),16)
If GetWindowRect(Thisform.HWnd,@lcRect)#0 && Thisform.HWnd 更换为第三方窗体句柄即可
lnLeftUpX=CToBin(Substr(lcRect,1,4),'4rs') &&左上角 X 坐标,这个坐标是屏幕分辨率的值(下同),要转换成
lnLeftUpY=CToBin(Substr(lcRect,5,4),'4rs') &&左上角 Y 坐标
lnRightDownX=CToBin(Substr(lcRect,9,4),'4rs') &&右下角 X 坐标
lnRightDownY=CToBin(Substr(lcRect,13,4),'4rs') &&右下角 Y 坐标
Endif
十豆三 2010-10-30
  • 打赏
  • 举报
回复
在鼠标坐标系统中,不管什么分辨率屏幕在水平和垂直方向上均匀分割成65535×65535个单元

2,723

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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